如果我们不使用hashmap或hashset,则不需要Java hashCode()方法覆盖

use*_*658 10 java equals hashcode

我的同事压倒了这个equals()方法.我的回答是,你是否也覆盖了这个hashCode()方法?他的回答是因为我们不会使用哈希映射或哈希集,如果我们覆盖它应该不重要hashCode().那是对的吗?

ass*_*ias 14

是的,事实上他是正确的 - 但是,如果你需要在某天将对象放在基于散列的集合中,你将不得不在任何地方添加哈希码,这可能很烦人+那天你可能会错误地实现你的哈希码(即不一致)等于)因为你错过了equals方法中的一些微妙之处......

考虑到大多数IDE提供了auto equals/hashcode生成功能,我认为没有理由不创建它们.

查看它的另一种方法是:当您从父类重写方法时,您应该遵循该父类定义的契约.在Object的情况下,equals的javadoc非常清楚:

请注意,通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等对象必须具有相等的哈希代码.

因此,除非您有真正的设计理由不覆盖哈希码,否则默认决策应该是遵循父类合同并覆盖其中之一或两者.

  • 我对`return 1;`的问题是,如果稍后使用`HashSet`,它似乎可能导致无声,难以调试的性能问题.相反,我将`hashCode()`实现为`throw new UnsupportedOperationException()`,这需要很少的努力,但是当你回来使用`HashSet`以后你没有打扰实现`hashCode( )``第一次. (7认同)
  • +1但另一方面,如果`equals`是代码所依赖的东西,那么`hashCode`很可能落后于'equals`的变化,再次与它不一致.对我来说,最好的折衷方案是简单的"返回1";`---至少它在技术上是正确的. (2认同)

har*_*pun 5

如果覆盖equals(),也要覆盖hashCode().即使您现在不使用hashCode(),您或其他人也可能会使用它.

有关此主题的更多信息,请查看优秀的SO答案