我有一个 Person 类,其 hashCode 将始终返回相同的 int 值,例如101 和 equals 总是返回 false 即
@Override
public int hashCode() {
return 101;
}
@Override
public boolean equals(Object obj) {
return false;
}
现在,我已将 100 个 Person 对象放入 HashMap 中,即
Map<Person, Integer> personMap = new HashMap<Person, Integer>();
for(int i = 1; i<=100; i++){
Person p = new Person();
p.setId(i);
personMap.put(p, i);
}
HashMap put方法每次都会创建Entry对象,由于所有Person对象的hashCode都是相同的,并且equals返回false,Entry会维护类似HashCode的链表,但这样我们就增加了HashMap size 与存储桶大小。现在我想知道为什么当 Entry 本身维护链表时我们还要增加 HashMap 的大小和存储桶?
寻求示例和解释来证明为什么 HashMap 需要这样做。
最佳答案
我们正在增加 HashMap
保持每个存储桶的较低平均条目数的能力,这使我们能够 put
和get
往返 HashMap
的条目在预期的恒定时间内(即 O(1))。
你的例子是 HashMap
的错误用法,因为您将所有条目强制放入同一个存储桶中,但在正常使用情况下,大多数存储桶将有 0 或 1 个条目,并且很少有存储桶将拥有超过 1 个条目(假设使用较低的负载系数)。
HashMap
中的桶数当 HashMap
中的条目总数增加时达到capacity * loadFactor
,其中capacity
是当前桶的数量。因此,如果loadFactor < 1
(默认为0.75),每个桶将包含少于1 Entry
平均而言。
关于java - 当我们有相同HashCode和差异等于的Entry对象的链接列表时,HashMap存储桶不被使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31674497/