为什么我应该为以下场景重写equals和hashcode方法

时间:2015-01-14 04:22:20

标签: java hashmap override equals hashcode

为什么我需要覆盖直接访问Hash map中的值。也就是说,如果按照HashMap将数据插入到hashmap中,我可以通过将Key作为Integer来获取值,将Object作为Value。在这种情况下是它覆盖equals()和hashCode()方法需要什么?请给出建议。

2 个答案:

答案 0 :(得分:1)

不,您不需要覆盖任何内容以将对象用作HashMap中的

只有需要有效hashCode()

但是,您需要实现这两种方法(技术上只有equals,但如果您想使用Map#containsValueList#indexOf或{ {1}}(这些不应该只是使用引用标识)。

答案 1 :(得分:-1)

当您想要从hashTable中检索特定元素时,

hashCode()用于搜索特定元素。 hashCode()不必是明确的。实际上,您可以为所有实例返回相同的整数,但是,elems存储在列表而不是hashTable中,并且会导致性能问题。

  • 默认情况下,JVM的hashCode()(它是Object的子类到子区的实现)会根据对象的内存地址返回一个整数,所以这应该是足够了,但JVM标准并不要求这个工具。

  • 默认情况下(类object),equals()的实现将返回true,并且仅当它们具有相同的引用时才返回true,即obj1 == obj2read this

请记住:

  • 平等对象必须具有相同的hashCode()
  • 那些具有相同hashCode()的人不需要彼此相等。

我认为在大多数情况下不需要覆盖hashCode()(不是从其他类扩展),因为现代JVM已经完成了 对你很好。

所以结论是:

如果你的超级类覆盖了hashCode()equals()方法,那么你应该覆盖它们,或者至少看看实现,并决定是否应该覆盖它们。