【问题标题】:What happens to the index of the values in a HasMap when it increases its size?当 HashMap 的大小增加时,值的索引会发生什么变化?
【发布时间】:2019-03-30 22:06:29
【问题描述】:

我明白,当我们声明如下地图时:

Map <String, Integer> map = new HashMap ();

默认加载因子为0.75,大小为16,当map的桶数超过12个元素时,大小变为32。

但是,使用 put 函数时,map 选择放置对象的桶的索引的方式由 hascode % n 定义,但是当 map 大小超过负载因子时会发生什么? n不再具有相同的值,因此,如果在应用hascode % n时,结果索引与以前不同,如何找到先前设置的条目?

我的最后一个问题是:

我们增加大小后,桶的索引怎么能一样?

【问题讨论】:

  • Map 不维护索引。顺便说一句,hashcode() 是项目的属性,而不是基于项目可能位于的任何集合...

标签: java dictionary hash hashmap hashtable


【解决方案1】:

HashMap 的默认初始容量为 16,负载系数为 0.75f(即当前地图大小的 75%)。负载因子表示HashMap 容量应该加倍的水平。

例如容量和负载系数的乘积为16 * 0.75 = 12。这表示将第 12 个键值对存入 HashMap 后,其容量变为 32。

For Further Exposure

进一步流程说明

哈希映射的重新散列是在 地图达到最大阈值。

通常负载因子值为0.75,默认初始容量 值为 16。一旦元素数量达到或超过 0.75 次 容量,然后重新散列地图。在这种情况下,当 元素数量为 12,然后进行重新散列。 (0.75 * 16 = 12)

当重新散列发生时,一个新的散列函数甚至是相同的散列 可以使用函数,但存在值的存储桶 可以改变。基本上当重新散列发生时,桶的数量 大约翻了一番,因此新指数的价值 必须进行更改。

在重新散列时,每个桶的链表在 命令。发生这种情况是因为 HashMap 没有将新元素附加到 尾部而不是在头部附加新元素。所以当 重新散列发生时,它读取每个元素并将其插入新的 桶在头部,然后继续从旧的添加下一个元素 map 位于新 map 的头部,导致链表反转。

如果有多个线程处理同一个哈希映射,它可以 导致无限循环。

上面详细说明了无限循环是如何发生的 案例可以在这里找到:

Read this Article for more unserstanding

如果插入到地图中的元素必须按键排序,那么 可以使用树形图。但是 HashMap 会更有效,如果 order of 键无关紧要。

【讨论】:

  • 这如何回答他的问题?
【解决方案2】:

内部数据 结构被重建。来自文档:https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

当哈希表中的条目数超过负载因子和当前容量的乘积时,对哈希表进行重新哈希(即重建内部数据结构),使哈希表的条目数大约是原来的两倍桶。

【讨论】:

    【解决方案3】:

    Hashmaps 不保留排序。看看改用LinkedHashMaps

    【讨论】:

    • 他没有说他们做到了。他说的是桶的索引。桶是一个数组,所以有一个索引。
    【解决方案4】:

    我想您要问的是“我们增加了大小后,桶的索引怎么会一样?”

    嗯,简单的答案是它不能。 HashMap 必须在其展开时对所有元素执行重新散列。

    看下面的方法:

    /**
     * Transfers all entries from current table to newTable.
     */
    void transfer(Entry[] newTable, boolean rehash) {
    

    resize 调用。 JavaDoc 中说的

    重新散列这个地图的内容到一个新的数组中 容量。该方法在keys数量达到时自动调用 在这张地图中达到了它的门槛。

    强调我的

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-03
      • 2021-10-07
      • 2017-05-09
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      • 2017-08-22
      相关资源
      最近更新 更多