我对HashMap
中 Rehashing 的概念表示怀疑。
假设我有一个大小为8的HashMap
,并且我在索引7处有一个Object(E1)。所以当我们放置多个元素时,强制HashMap增加其内部数组大小,这将是导致重复。
所以我的问题是,重新进行后,我的对象(E1)将被放置在第7个索引处还是会得到一个不同的存储桶。
感谢有用的回应和参考。
答案 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也使用了相同的术语并将其称为“重新哈希”。但是它描述了重建内部数据结构-数组的过程。他们称这个数组为哈希表,我认为这就是原因,新创建哈希表被称为重新哈希。