我有一个列表( List<T> list
),我想使用地图( HashMap<Integer, T> map
)通过它们的ID索引它的对象。我总是使用 list.size()
作为 HashMap
构造函数中的 初始容量,如下面的代码所示。这是在这种情况下使用的最佳初始容量吗?
注意:我永远不会向地图添加更多项目。
List<T> list = myList;
Map<Integer, T> map = new HashMap<Integer, T>(list.size());
for(T item : list) {
map.put(item.getId(), item);
}
原文由 Italo Borssatto 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您希望避免重新
HashMap
,并且您知道不会将其他元素放入HashMap
,那么您必须考虑负载因子和初始容量. aHashMap
的加载因子默认为 0.75 。每当添加新条目时,都会进行确定是否需要重新散列的计算,例如
put
放置一个新的键/值。因此,如果您指定list.size()
的初始容量,以及 1 的负载因子,那么它将在最后一个put
之后重新散列。因此,为防止重新散列,请使用负载因子 1 和容量list.size() + 1
。编辑
查看
HashMap
源代码,如果 旧 大小达到或超过阈值,它将重新散列,因此它不会在最后一个put
。所以看起来list.size()
的容量应该没问题。这是
HashMap
源代码的相关部分: