【问题标题】:Rehashing in HashMap in Java在 Java 中的 HashMap 中重新散列
【发布时间】:2015-04-15 06:23:47
【问题描述】:

我对@9​​87654321@中的Rehashing的概念有一点疑问。

假设我有一个大小为 8 的 HashMap,其中我在索引 7 处有一个 Object(E1)。所以当我们放置多个元素时,强制 HashMap 增加其内部数组大小,这将导致重新散列。

所以我的问题是,在重新散列之后,我的 Object(E1) 会被放置在第 7 个索引处还是会得到不同的存储桶。

欣赏有用的回复和参考。

【问题讨论】:

  • 想知道:你为什么在乎?换句话说:这些信息究竟以何种方式相关? (并不是说这是一个坏问题;我只是想知道实际相关性)
  • 它将进入不同的存储桶(除非碰巧新的计算存储桶又是第 7 个)您为什么不阅读源代码?它带有 JDK。
  • @Jägermeister:只是为了好奇:)
  • @JBNizet :知道了 :)...谢谢您的回复

标签: java hashmap


【解决方案1】:

OpenJDK implementation 表明每个新存储桶将被重新索引到新表中的(可能)不同的索引:

 void More ...transfer(Entry[] newTable) {
489         Entry[] src = table;
490         int newCapacity = newTable.length;
491         for (int j = 0; j < src.length; j++) {
492             Entry<K,V> e = src[j];
493             if (e != null) {
494                 src[j] = null;
495                 do {
496                     Entry<K,V> next = e.next;
497                     int i = indexFor(e.hash, newCapacity); // <-- new index is calculated here
498                     e.next = newTable[i];
499                     newTable[i] = e; // <-- and assigned
500                     e = next;
501                 } while (e != null);
502             }
503         }
504     }

【讨论】:

  • 感谢您的回答:)
【解决方案2】:

它将被放置在不同的索引处。我发布答案是为了强调 Re-Hashing 一词不能正确表示操作。它应该是重新索引

不幸的是oracle docs 也使用了相同的术语并将其称为“重新散列”。但它描述了重建内部数据结构 - 数组的过程。。这个数组被他们称为哈希表,我认为这就是原因,新创建哈希表被称为重新哈希。

【讨论】:

    【解决方案3】:

    您的密钥所在的存储桶是其hashCode 模数的函数,它是用于保存 HashMap 的数组的大小(即存储桶的数量),因此重新散列可以将密钥移动到不同的存储桶.

    【讨论】:

    • 感谢您的回答:)
    猜你喜欢
    • 1970-01-01
    • 2021-10-15
    • 2014-05-21
    • 2012-05-26
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2019-09-11
    相关资源
    最近更新 更多