【问题标题】:Compute hashCode for OR logic为 OR 逻辑计算 hashCode
【发布时间】:2013-04-03 15:23:06
【问题描述】:

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

obj1 等于 obj2 当且仅当:

obj1.A is equal to obj2.A

或

obj1.B is equal to obj2.B

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

【问题讨论】:

    标签: java logic equals hashcode


    【解决方案1】:

    您的equals 方法不具有传递性。它不尊重basic principles 之一:

    equals 方法在非 null 上实现等价关系 对象引用:

    它是自反的:对于任何非空引用值 x,x.equals(x) 应该返回真。它是对称的:对于任何非空参考值 x 和 y,x.equals(y) 应该返回 true 当且仅当 y.equals(x) 返回真。

    它是可传递的:对于任何非空引用值 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。

    【讨论】:

    • 好吧,我太傻了。很好,看来我需要复习一下我的基础知识。所以,我将无法像我想象的那样使用唯一键。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多