我有一个对象作为唯一标识符,它有两个参数,我们称它们为 A 和 B,并具有以下逻辑:
obj1 等于 obj2 当且仅当:
obj1.A is equal to obj2.A
或者
obj1.B is equal to obj2.B
如何为该对象计算符合合同要求的 hashCode()?我是否坚持做“总是返回 0”的低效解决方案?不知道在这里做什么样的数学
你的equals
方法不是传递的。它不尊重基本原则之一:
equals 方法在非空对象引用上实现等价关系:
它是自反的:对于任何非空引用值 x,x.equals(x) 应该返回 true。它是对称的:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应该返回 true。
它是可传递的:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true 并且 y.equals(z) 返回 true,则 x.equals(z) 应该返回 true。
它是一致的:对于任何非空引用值 x 和 y,x.equals(y) 的多次调用始终返回 true 或始终返回 false,前提是没有修改对象上 equals 比较中使用的信息。对于任何非空引用值 x,x.equals(null) 应该返回 false。
这种“平等”逻辑使您的对象不适合作为键,您无法通过简单地设计一种hashCode
方法来解决此问题,
不要将此作为一种equals
方法,而是使用您自己的语义,例如isEquivalentTo
.