问题:我有一个列表 ( List<T> list
),我想使用映射 ( HashMap<Integer, T> map
) 通过它们的 id 来索引它的对象。我总是在构造函数中list.size()
用作初始容量HashMap
,如下面的代码所示。这是在这种情况下使用的最佳初始容量吗?
Note: I'll never add more items to the map.
List<T> list = myList;
Map<Integer, T> map = new HashMap<Integer, T>(list.size());
for(T item : list) {
map.put(item.getId(), item);
}
知识扩展:默认情况下,HashMap 的“加载因子”为 0.75,这意味着当 HashMap 中的条目数达到所提供容量的 75% 时,它将调整数组大小并重新散列。
解决方案:
例如,如果我这样做:
Map<Integer, Integer> map = new HashMap<>(100);
当我添加第 75 个条目时,映射会将条目表的大小调整为 2 * map.size()(或 2 * table.length)。所以我们可以做几件事:
- 更改负载因子 - 这可能会影响map的性能
- 将初始容量设置为 list.size() / 0.75 + 1
最好的选择是两者中的后者,让我解释一下这里发生了什么:
list.size() / 0.75
这将返回 list.size() + list.size() 的 25%,例如,如果我的列表的大小为 100,它将返回 133。然后,如果map的大小为等于初始容量的 75%,所以如果我们有一个大小为 100 的列表,我们会将初始容量设置为 134,这意味着从列表中添加所有 100 个条目不会导致map的任何大小调整。
最终结果:
Map<Integer, Integer> map = new HashMap<>(list.size() / 0.75 + 1);
现在你懂了吗?有问题欢迎评论区留言。
👍如果对你有帮助,给博主一个免费的点赞以示鼓励
欢迎各位🔎点赞👍评论收藏⭐️