当我们具有相同HashCode和Difference Equals的Entry对象的链接列表时,HashMap存储桶未使用

时间:2015-07-28 11:06:49

标签: java hashmap

我有一个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需要这样做。

3 个答案:

答案 0 :(得分:1)

我们正在增加HashMap容量以保持每个桶的平均条目数较少,这样我们就可以putget条目进出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根本不是针对此用例设计的。它假设哈希码将随机分布。