如果equals被重写但是hashCode没有被重写,该如何处理?

3

我遇到了一些第三方代码,它重写了equals()方法但没有重写hashCode()方法。如果我不把这些对象用作Map键,那么这样做是无害的吗?

当然,我可以为hashCode(在几个对象中)添加重写,但这样做会使我在接收升级时每次都要增加更多的工作。


这是一个开源项目吗?如果是的话,考虑为自己和其他使用第三方库的人做个大忙,提交缺失的hashCode()方法(如果你决定实现它们的话)。 - matsev
3个回答

1

除了Map之外,您还需要检查:

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

  2. Comparator,Comparable无法使用hashcode进行比较。

  3. 实用概念

希望这能帮到您。


0

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

我会找另一个库。如果他们不能正确覆写 equals 和 hashCode,那么还有什么是他们做得对的呢?


3
我不使用这些对象作为Map键,这就涵盖了你提到的"HashMap将使用hashCode"。 - Jon Skeet
2
@Jon,这种做法如此糟糕,以至于确实引起人们对整个库的质量的担忧,难道没有任何值得说的吗? - Kirk Woll
@KirkWoll:是的,我同意答案的这一部分。我不同意第一部分。 - Jon Skeet
不幸的是,可能没有成本效益的替代方案,而普通用户并不是真正的抱怨者。(如果质量不佳,它会创建进入障碍,并创造咨询工作。)我希望能得到一些关于除Map / HashMap之外要注意什么的提示。 - H2ONaCl

0
如果对象没有继承另一个类(因此它们从Object继承),那么它们的hashCode是它们的对象引用的函数。这意味着,如果您将它们用作HashMap中的键(或作为HashSet的元素),则只能期望在执行查找时使用完全相同的对象实例才能找到它们。
“约定”是,如果两个对象相等,则它们必须具有相同的hashCode,但是您的分析是正确的- hashCode仅在集合API(HashSet、HashMap等)中才重要。您应该知道如何使用API,因此如果您知道不会使用hashCode,并且您不会在公共API中公开此API的对象,则没有问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接