在Java中重写hashCode()时应该重写'equals'(Object)方法吗?

问题描述:

在Java中重写hashCode()时,是否应该覆盖equals(Object)方法?在Java中重写hashCode()时应该重写'equals'(Object)方法吗?

我已阅读合同覆盖equals,您应覆盖hashCode。反之亦然是真的吗?

我正在考虑一个场景,我不比较对象,没有等于方法。

+1

简单的回答:是的。详细的答案:检查可能的重复。 – 2013-05-09 17:11:36

+0

这不是重复的,有特殊意图的要求 – abhi 2013-05-09 17:16:34

+0

如果你理解了这个概念,那么你就会知道答案。既然你不理解它,你必须再次阅读这个概念。顺便说一下,从副本Q/A:*如果你重写一个,那么你应该重写另一个。*你有你的答案。 – 2013-05-09 17:17:14

是的,它应该被覆盖。如果您认为您需要覆盖hashCode(),那么您需要覆盖equals(),反之亦然。的hashCode()常规协定是:

  1. 每当它是一个Java应用程序的执行期间,在同一对象不止一次调用,hashCode方法必须一致地返回相同的整数,没有提供所用的信息equals比较对象被修改。该整数不需要从应用程序的一次执行到同一应用程序的另一次执行保持一致。

  2. 如果两个对象根据equals(Object)方法相等,则对两个对象中的每个对象调用hashCode方法必须产生相同的整数结果。

  3. 不要求,如果两个对象根据equals不相等(java.lang.Object)方法,然后调用在每个两个对象的hashCode方法必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。

约书亚布洛赫在他的“有效的Java”第3章中讲清楚 - 这些必须是同步的。他们应该总是一起被覆盖。