繁体   English   中英

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

[英]How to proceed if equals was overridden but not hashCode?

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

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

除了地图,您需要检查:

  1. 如果你正在使用这个类在你的ORM,更多信息的情况下,在上哈希码实现,你可以使用Apache的HashCodeBuilder

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

  3. 务实的概念

希望这可以帮助。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM