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

时间:2013-05-09 17:11:04

标签: java

在Java中覆盖hashCode()时是否应该覆盖equals(Object)方法?

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

我在想一个我不比较对象,没有等于方法的场景。

2 个答案:

答案 0 :(得分:5)

是的,它应该被覆盖。如果您认为需要覆盖hashCode(),则需要覆盖equals(),反之亦然。 hashCode()的一般合同是:

  1. 每当在执行Java应用程序期间多次在同一对象上调用它时,hashCode方法必须始终返回相同的整数,前提是不修改对象上的equals比较中使用的信息。从应用程序的一次执行到同一应用程序的另一次执行,此整数不需要保持一致。

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

    < / LI>
  3. 如果两个对象根据equals(java.lang.Object)方法不相等,则不需要在两个对象中的每一个上调用hashCode方法必须生成不同的整数结果。但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能。

答案 1 :(得分:1)

约书亚布洛赫在他的“有效Java”第3章中明确指出 - 这些必须紧密相连。它们应该一直被覆盖。