gpt4 book ai didi

java - HashMap 不会按照默认值重新哈希

转载 作者:行者123 更新时间:2023-12-02 14:15:15 25 4
gpt4 key购买 nike

根据 Java 文档

An instance of HashMap has two parameters that affect its performance: initial capacity and load factor. The capacity is the number of buckets in the hash table, and the initial capacity is simply the capacity at the time the hash table is created. The load factor is a measure of how full the hash table is allowed to get before its capacity is automatically increased. When the number of entries in the hash table exceeds the product of the load factor and the current capacity, the hash table is rehashed (that is, internal data structures are rebuilt) so that the hash table has approximately twice the number of buckets.

 the default initial capacity is 16 and the default load factor is 0.75.

根据上述,HashMap 的阈值是 12(16 * 0.75),并且 HashMap 在放入第 13 个元素时应该重新哈希。

我创建了一个空的 HashMap 并在其中放入了 16 个元素。我在 Debug模式下运行它。当放置第 13 个元素时,我检查了调试变量,并惊讶地发现阈值仍然是 12(而不是 24) 并且表数组仍然包含 16 条目(而不是 32) 。仅在放入第 16 个元素后,哈希表才会重新哈希,使阈值 24(32 * 0.75)

我错过了什么吗?

最佳答案

我在HashMap(Java 7)的源代码中找到了答案。输入一个值将运行以下代码:

public V put(K key, V value) {
[...]
modCount++;
addEntry(hash, key, value, i);
return null;
}

有趣的调用是添加条目的方法。我们来看看这个方法的来源:

void addEntry(int hash, K key, V value, int bucketIndex) {
if ((size >= threshold) && (null != table[bucketIndex])) {
resize(2 * table.length);
hash = (null != key) ? hash(key) : 0;
bucketIndex = indexFor(hash, table.length);
}
createEntry(hash, key, value, bucketIndex);
}

正如我们所见,仅当大小超过阈值并且计算出的存储桶(用于放置条目)不为空时,才会进行大小调整。

这种行为是有道理的。只要每个条目进入一个空桶,就不需要调整大小,因为每个条目都位于桶列表的第一个位置,因此很容易找到。 这一切都与性能有关。事实上,有很多实现细节都表现得非常好。

编辑(因为 Java 6 和 Java 7 之间存在差异):

上面的源代码来自Java 7。实际上,在Java 6中,调整大小行为仅取决于大小和阈值。这是 Java 6 中 addEntry 方法的来源:

void addEntry(int hash, K key, V value, int bucketIndex) {
Entry<K,V> e = table[bucketIndex];
table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
if (size++ >= threshold)
resize(2 * table.length);
}

这实际上意味着 HashMap 实现从 Java 6 更改为 Java 7(由于性能原因)。

关于java - HashMap 不会按照默认值重新哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24503325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com