java - 当我们有相同HashCode和差异等于的Entry对象的链接列表时,HashMap存储桶不被使用

标签 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对象,由于所有Person对象的hashCode都是相同的,并且equals返回false,Entry会维护类似HashCode的链表,但这样我们就增加了HashMap size存储桶大小。现在我想知道为什么当 Entry 本身维护链表时我们还要增加 HashMap 的大小和存储桶?

寻求示例和解释来证明为什么 HashMap 需要这样做。

最佳答案

我们正在增加 HashMap保持每个存储桶的较低平均条目数的能力,这使我们能够 putget往返 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/

相关文章:

java - 强制 Spring RestTemplate 忽略响应的内容类型 header

java - HashMap.values() 和 HashMap.keySet() 如何返回值和键?

java - 即使没有 "mapping"也使用 Java HashMap ?

java - 京都内阁/伯克利 DB : Hash table size limitations

海量数据的 Java HashMap/List 替代方案

java - "Closed"Java/Scala 中的 HashMap

java - 使用Java根据关键字解析文本

java - 如果我使用 Single<> 为什么我不应该使用blockingGet() 以及替代品是什么

java - 左加入 spring data jpa 和 querydsl

java - JPanel 绘图故障