2

我有一个对象作为唯一标识符,它有两个参数,我们称它们为 A 和 B,并具有以下逻辑:

obj1 等于 obj2 当且仅当:

obj1.A is equal to obj2.A

或者

obj1.B is equal to obj2.B

如何为该对象计算符合合同要求的 hashCode()?我是否坚持做“总是返回 0”的低效解决方案?不知道在这里做什么样的数学

4

1 回答 1

11

你的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.

于 2013-04-03T15:25:46.533 回答