如果等于被覆盖而不是hashCode,如何继续?

时间:2011-11-12 16:26:48

标签: java hashcode

我遇到了一些覆盖equals()但不覆盖hashCode()的第三方代码。我是否正确地认为,只要我不将这些对象用作Map键,这是无害的?

我当然可以为hashCode添加覆盖(在几个对象中),但每次收到升级时我都会为自己创建更多的工作。

3 个答案:

答案 0 :(得分:1)

除了地图,您需要检查:

  1. 如果您在ORM中使用此类的实例,更多信息at,则在哈希码实现中您可以使用Apache's HashCodeBuilder

  2. 比较器,此类上的Comparable不能使用哈希码来检查比较。

  3. Pragmatic Concept

  4. 希望这有帮助。

答案 1 :(得分:0)

我认为你不能认为它是无害的。 HashMap将使用hashCode。

我会找到另一个图书馆。如果他们无法正确覆盖equals和hashCode,那么他们还有什么错呢?

答案 2 :(得分:0)

如果对象没有扩展另一个类(因此它们从Object继承),那么它们的hashCode是它们的对象引用的函数。这意味着如果您将它们用作HashMap中的键(或作为HashSet的一个元素),只有在使用完全相同的对象实例进行查找时才能找到它们。

“契约”是指如果两个对象相等,则它们必须具有相同的hashCode,但是您的分析是正确的 - hashCode仅在集合API(HashSet,HashMap等)中很重要。你应该知道如何使用API​​,所以如果你知道你不会使用hashCode,并且你没有在公共API中公开API的这些对象,那么就没有问题了。