【发布时间】:2013-09-28 06:31:01
【问题描述】:
我打算使用一个键是相当长的列表(约 10/100k 的小元素)的地图:
Map<List<K>, V> myMap = new HashMap<List<K>, V>();
默认的List::hashCode() 实现(在 AbstractList 中)使用所有列表元素的哈希码在循环中计算它的哈希码值。 List::equals() 方法也依次比较所有列表元素,并为第一个不同的元素返回 false。
这一切都是有道理的,除了列表哈希码值没有缓存(JDK 6)因此每次都重新计算,这使得这种使用模式非常低效(地图经常依赖哈希码) . equals() 的问题会更少,因为不同的元素平均会在相当低的索引处具有第一个不同的项目,因此循环会提前中断(但必须比较相同列表的所有元素)。
我正在考虑用一个新的自定义 KeyList 类封装我的列表,将哈希码值保存在缓存中以提高性能,但是:
- 这不是小事,因为您必须处理同步问题并实现一些列表接口方法;
- 这是侵入性的,因为您必须在客户端代码中使用此装饰器;
- 这并不能解决比较相同元素时
equals()的性能问题。
有没有更好的办法来处理这种情况?
【问题讨论】:
标签: java list design-patterns collections map