我试图了解在超过占用的存储桶数或所有存储桶中的条目总数时是否会发生哈希映射的重新散列。意味着,我们知道如果 16 个桶中的 12 个(每个桶中有一个条目)已满(考虑默认负载因子和初始容量),那么我们知道在下一个条目上哈希图将被重新散列。但是,如果假设只有 3 个存储桶被每个 4 个条目占用(总共 12 个条目,但 16 个存储桶中只有 3 个在使用中),那这种情况呢?
所以我试图通过制作最差的哈希函数来复制这一点,它将所有条目放在一个桶中。
这是我的代码。
class X {
public Integer value;
public X(Integer value) {
super();
this.value = value;
}
@Override
public int hashCode() {
return 1;
}
@Override
public boolean equals(Object obj) {
X a = (X) obj;
if(this.value.equals(a.value)) {
return true;
}
return false;
}
}
现在我开始将值放入哈希图中。
HashMap<X, Integer> map = new HashMap<>();
map.put(new X(1), 1);
map.put(new X(2), 2);
map.put(new X(3), 3);
map.put(new X(4), 4);
map.put(new X(5), 5);
map.put(new X(6), 6);
map.put(new X(7), 7);
map.put(new X(8), 8);
map.put(new X(9), 9);
map.put(new X(10), 10);
map.put(new X(11), 11);
map.put(new X(12), 12);
map.put(new X(13), 13);
System.out.println(map.size());
所有节点都按预期进入了单个存储桶,但我注意到在第 9 个条目时,哈希图重新哈希并使其容量增加了一倍。现在在第 10 次入境时,它的容量再次翻了一番。
谁能解释这是怎么回事?
提前致谢。