我有一个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对象,因为hashCode对于所有Person对象都是相同的并且equals返回false,Entry将维护类似HashCode的Linked List,但是我们在HashMap中增加了尺寸,铲斗尺寸。现在我想知道为什么我们在Entry本身维护链接列表时增加HashMap大小和存储桶?
寻求示例和解释,证明为什么HashMap需要这样做。
答案 0 :(得分:1)
我们正在增加HashMap
容量以保持每个桶的平均条目数较少,这样我们就可以put
和get
条目进出HashMap
预期的恒定时间(即O(1))。
您的示例是HashMap
的错误用法,因为您强制所有条目进入同一个存储桶,但在正常使用情况下,大多数存储桶将包含0或1个条目,并且很少存储桶具有多于1个存储桶(假设使用了低负载系数)。
当HashMap
中的条目总数达到HashMap
时,capacity * loadFactor
中的存储区数量会增加,其中capacity
是当前的存储区数。因此,如果loadFactor < 1
(默认值为0.75),则每个存储桶平均包含的内容少于1 Entry
。
答案 1 :(得分:0)
随着地图条目数量的增加,地图的载入因子进入画面,以保持带有地图的关键字的有效分布。请记住,HashMap不知道您的哈希码函数的实现,而Load Factor也适用于Map的有效大小。
答案 2 :(得分:0)
HashMap
根本不是针对此用例设计的。它假设哈希码将随机分布。