【问题标题】:How many times can rehashing occur in a hashmap哈希图中可以发生多少次重新散列
【发布时间】:2016-10-23 07:42:51
【问题描述】:

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

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

我知道,当地图已满时,很可能我们做错了什么。

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

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

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

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

Rehashing in Hashmap

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

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

【问题讨论】:

    标签: java hash hashmap


    【解决方案1】:

    这取决于地图的种类。

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

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

    因此,根据这个定义,可以将 Map 以 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

    【讨论】:

    • ok ...if (oldCapacity == MAXIMUM_CAPACITY) { threshold = Integer.MAX_VALUE;返回; }
    • 确切的数字可能会稍微少一些,关于最小表大小和增长时应用的确切规则有很多地方需要检查。但是这个答案给出了一个很好的估计,对于回答面试问题应该绰绰有余。
    猜你喜欢
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 2021-07-01
    • 2021-10-12
    • 1970-01-01
    相关资源
    最近更新 更多