提问者:小点点

在哈希图中可以进行多少次重新散列


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

一次HashMap中可以发生多少次重新散列?两次或N次?[每次添加(阈值1)个元素时]

我知道当一张地图满了,那么很可能我们做错了什么。

我承认我不能给出一个满意的答案。有人能告诉我回答这类问题的方法吗?

或者,面试官在令人信服的答案中到底在寻找什么?

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

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

Hashmap中的重复散列

当哈希表中的条目数超过加载因子和当前容量的乘积时,哈希表被重新哈希(内部数据结构被重建),因此哈希表具有大约两倍的桶数。当你重新散列和移动所有东西到一个新的位置(桶,等等。)然后,较旧的元素也再次被重新散列,并根据它们的新散列码存储在新桶中。被分配来存储元素的旧空间被垃圾回收。

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


共1个答案

匿名用户

这取决于地图的类型。

例如,对于HashMap,存在一个方法resize,定义如下:

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

因此,根据该定义,有可能以2的幂的步长将地图放大到< code>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