对碰撞的哈希表的加载因子感到困惑

时间:2016-12-11 19:20:59

标签: java hashmap hashtable hashcode

我对这种哈希表的负载因素感到困惑 我知道为了计算负载因子,我们需要将条目数除以我们拥有的槽数,当加载因子达到0.75时,它必须重新进行重新分割。

那么,什么是" entires"对于这个哈希表?密钥总数或这些密钥占用的索引总数。

因为如果它是键的总数,那么重复的重点是什么?这只会浪费空间和时间 如果它是仅占用索引的总数,那么负载因子将是2/5 = 0.4?

enter image description here

1 个答案:

答案 0 :(得分:0)

条目数是地图中键值映射的数量,如返回的 https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#size-- 或者,返回的Set中的元素数量 https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#entrySet--

这符合我们关于地图是什么的直觉,一组键值对,所以每一对都是一个条目。

https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html项将条目数与负载因子fac(任意参数)和容量cap(当前桶数)的乘积进行比较。

您会想到“当负载系数达到”时,但这是不正确的。施工后载荷系数不会改变。默认情况下它是0.75,足以满足所有用途。

而不是threshold产品threshold = fac * cap;。 阈值仅在cap更改时更改,因为fac没有。

始终更改的内容是nentries,即当前在地图中的条目数。

(我只是编写变量名来简化这个答案。它们与实际的Java API源代码无关。)

您的图表显示了五个存档桶,因此threshold = (int)(0.75 * 5)3

重新发布的决定是if (nentries >= threshold)。您的图片中有十个条目,是的,该地图需要重新散列。实际上,它会在第三个条目上重新进行,将cap增加到大约十个条目,具体取决于实现。在第八个条目上,容量将增加到二十个,因此十个条目将小于新阈值threshold = 0.75 * 2016