我对这种哈希表的负载因素感到困惑 我知道为了计算负载因子,我们需要将条目数除以我们拥有的槽数,当加载因子达到0.75时,它必须重新进行重新分割。
那么,什么是" entires"对于这个哈希表?密钥总数或这些密钥占用的索引总数。
因为如果它是键的总数,那么重复的重点是什么?这只会浪费空间和时间 如果它是仅占用索引的总数,那么负载因子将是2/5 = 0.4?
答案 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 * 20
或16
。