最近,我参加了面试,面试官问我这个问题。
一次HashMap中可以进行多次重组?两次?或N次? [每次添加(阈值+1)元素时]
我知道当地图已满时,我们可能会做错事。
我承认我无法给出满意的答复。谁能告诉我回答这些问题的方法。
或者,面试官究竟在寻找一个令人信服的答案?
以下是我在提出这个问题之前提到的一些问题。
https://stackoverflow.com/a/28811708 "当地图中的元素数量达到阈值时,完成哈希映射的重新散列" HashMap的加载因子为0.75,默认初始容量值为16.一旦元素数量达到或超过12个元素,就会发生地图重新散列。
当哈希映射中的条目数超过加载因子和当前容量的乘积时,哈希映射将被重新哈希(内部数据结构被重建),因此哈希映射具有大约两倍的桶数。 当您重新散列并将所有内容移动到新位置(存储桶等)时,旧元素也会再次重新散列,并根据新的哈希码存储在新存储桶中。分配用于存储元素的旧空间是垃圾收集。
答案 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
。