在 Java 中重写 hashCode() 时是否应该equals
重写 (Object) 方法?
我已经阅读了覆盖equals
,你应该覆盖的合同hashCode
。反之亦然吗?
我在想一个我不比较对象的场景,没有 equals 方法。
在 Java 中重写 hashCode() 时是否应该equals
重写 (Object) 方法?
我已经阅读了覆盖equals
,你应该覆盖的合同hashCode
。反之亦然吗?
我在想一个我不比较对象的场景,没有 equals 方法。
是的,它应该被覆盖。如果您认为需要覆盖hashCode()
,则需要覆盖equals()
,反之亦然。hashCode()的一般合约是:
每当在 Java 应用程序执行期间对同一个对象多次调用它时,hashCode 方法必须始终返回相同的整数,前提是没有修改对象上的 equals 比较中使用的信息。该整数不需要从应用程序的一次执行到同一应用程序的另一次执行保持一致。
如果两个对象根据 equals(Object) 方法相等,则对两个对象中的每一个调用 hashCode 方法必须产生相同的整数结果。
如果根据 equals(java.lang.Object) 方法,如果两个对象不相等,则不需要对两个对象中的每一个调用 hashCode 方法都必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。
Joshua Bloch 在他的“Effective Java”的第 3 章中明确指出——这些必须步调一致。它们应该始终一起被覆盖。