在Java中重新使用HashMap

时间:2015-04-15 06:23:48

标签: java hashmap

我对HashMap Rehashing 的概念表示怀疑。

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

所以我的问题是,重新进行后,我的对象(E1)将被放置在第7个索引处还是会得到一个不同的存储桶。

感谢有用的回应和参考。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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 :(得分:2)

它将放置在其他索引处。我发布答案是为了突出说明 重新哈希 这个术语不能正确表示操作。它应该是重新索引

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