在散列映射中可以进行多次重新散列

时间:2016-06-21 16:27:50

标签: java hash hashmap

最近,我参加了面试,面试官问我这个问题。

一次HashMap中可以进行多次重组?两次?或N次? [每次添加(阈值+1)元素时]

我知道当地图已满时,我们可能会做错事。

我承认我无法给出满意的答复。谁能告诉我回答这些问题的方法。

或者,面试官究竟在寻找一个令人信服的答案?

以下是我在提出这个问题之前提到的一些问题。

https://stackoverflow.com/a/28811708 "当地图中的元素数量达到阈值时,完成哈希映射的重新散列" HashMap的加载因子为0.75,默认初始容量值为16.一旦元素数量达到或超过12个元素,就会发生地图重新散列。

Rehashing in Hashmap

当哈希映射中的条目数超过加载因子和当前容量的乘积时,哈希映射将被重新哈希(内部数据结构被重建),因此哈希映射具有大约两倍的桶数。 当您重新散列并将所有内容移动到新位置(存储桶等)时,旧元素也会再次重新散列,并根据新的哈希码存储在新存储桶中。分配用于存储元素的旧空间是垃圾收集。

https://stackoverflow.com/a/27384645/5086633

1 个答案:

答案 0 :(得分:3)

这取决于地图的种类。

例如,对于HashMap,存在一个方法调整大小,定义如下:

  

将此地图的内容重新整理为具有更大容量的新数组。当此地图中的键数达到其阈值时,此方法会自动调用。如果当前容量为MAXIMUM_CAPACITY,则此方法不会调整映射大小,但会将阈值设置为Integer.MAX_VALUE。这具有防止将来呼叫的效果。   参数:    newCapacity 新容量,必须是2的幂;必须大于当前容量,除非当前容量为MAXIMUM_CAPACITY(在这种情况下值不相关)

因此,根据这个定义,可以将功率为2的步长放大到MAXIMUM_CAPACITY

MAXIMUM_CAPACITY的值是

static final int MAXIMUM_CAPACITY = 1 << 30;

此值为1.073.741.824。

构建一个新的HashMap,表明初始容量为1,最多可以调整30个,因为2^30 = MAXIMUM_CAPACITY = 1.073.741.824