【发布时间】:2019-09-11 09:58:27
【问题描述】:
我正在尝试编写演示代码以显示当映射大小超过负载因子阈值时,Hashmap 中正在发生重新散列。 我如何证明重新散列正在内部发生。另外我想证明,即使在 rehash 期间旧条目被移动到新存储桶中,我也可以使用旧密钥获取旧元素(让我知道我的假设是正确的)。 在示例代码下方。
import java.util.*;
class RehashDemo{
public static void main(String[] args){
Map<Integer,String> numbers = new HashMap<>(10);
for(int i = 0; i<10;i++){
numbers.put(i,i+"");
}
System.out.println(numbers);
for(int j = 15; j<=20;j++){
numbers.put(j,j+"");
}
System.out.println(numbers);
}
}
【问题讨论】:
-
为什么不看源码呢?
-
结构不会“改变”!它们被扔掉,重建完全相同的结构,只是更大。这是一个实现细节,现在可以从外部看到。
-
如果我们增加桶的大小,那么哈希码就有可能发生变化。我说的对吗?
-
您可以使用调试器运行您的代码,以查看在重新散列 HashMap 后某些条目是否已移动到新存储桶中。
-
@JavaUser 哈希码不会改变。它只是被重新映射到(可能)不同的存储桶,因为存储桶是使用对存储桶数量取模来确定的。所以哈希码 17 最初会被映射到存储桶 1,但在第一次重新哈希后,它将被映射到存储桶 17。
标签: java collections hashmap hashtable hashcode