gpt4 book ai didi

java - 覆盖 equals 而不是 hashcode 的缺点是什么,反之亦然?

转载 作者:行者123 更新时间:2023-12-01 11:05:37 25 4
gpt4 key购买 nike

我知道有很多类似的问题,但我对我读到的答案不满意。我试图弄清楚,但我仍然不明白。我所知道的是,这两个在使用 set 或 map 时很重要,尤其是 HashSet、HashMap 或 Hash 对象,它们通常使用哈希机制来存储元素对象。

这两种方法都用于测试两个对象是否相等。为了使两个对象 A 和 B 相等,首先它们需要具有相同的哈希值(必须位于同一个存储桶中),其次我们必须在执行 A.equals(B) 时得到 true。

我不明白的是,为什么有必要重写这两个方法。如果我们不覆盖哈希码怎么办?是否必须覆盖两者。如果不是的话,覆盖 equals 而不是 hashcode 的缺点是什么,反之亦然。

最佳答案

正确实现hashCode您的对象必须成为基于哈希的容器中的键。没有其他必要。

这就是为什么它对于基于哈希的容器(例如 HashMap、HashSet、ConcurrentHashMap 等)很重要。

概括地说,HashMap 是一个数组,由键的 hashCode 索引,其条目是“链”——(键、值)对的列表,其中特定链中的所有键都具有相同的哈希码。有关哈希表的复习,请参阅 Wikipedia .

考虑一下如果两个键 A、B 相等但具有不同的哈希码会发生什么情况 - 例如 a.hashCode() == 42b.hashCode() == 37 。假设你写:

hashTable.put(a, "foo");
hashTable.get(b);

由于键相等,您希望结果为 "foo" , 正确的?然而,get(b)将查看对应于哈希值 37 的链,而 (a, "foo") 对位于哈希值 42 对应的链中,因此查找将失败,您将得到 null .

这就是为什么如果您打算将对象用作基于哈希的容器中的键,则相同的对象具有相同的哈希代码非常重要。

请注意,如果您使用非基于哈希的容器,例如 TreeMap ,那么您不必实现 hashCode因为容器不使用它。相反,在 TreeMap 的情况下,你应该实现compareTo - 其他类型的容器可能有自己的要求。

关于java - 覆盖 equals 而不是 hashcode 的缺点是什么,反之亦然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32983106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com