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



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

我读了合同,上面写着覆盖equals,你应该覆盖hashCode。反之亦然吗?

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

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

  1. 在Java应用程序执行期间,只要在同一对象上多次调用hashCode方法,hashCode方法必须始终返回相同的整数,前提是在对象的相等比较中使用的信息没有被修改。

  2. 这个整数不需要在同一个应用程序的一次执行和另一次执行中保持一致。
  3. 如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须产生相同的整数结果

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

Joshua Bloch在他的"Effective Java"的第3章中明确指出-这些必须是同步的。

最新更新