传递关系:当x.equals(y)为假且y.equals(z)为真时,x.equals(z)是什么

时间:2010-08-24 09:01:59

标签: java logic equals equality

假设equals()是可传递的; 我理解,如果x和y具有相等的双边协议,那么其中一个,比如y,就不会与第三类z自己达成协议。 但如果我们的情况是x.equals(y)= false(仍然是可传递的)那么这与z的双边协议应该是什么?

5 个答案:

答案 0 :(得分:5)

如果equals方法正确实现,则按对象的javadoc要求:

  
    
        
  • 它是自反的:对于任何非空引用值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)应该返回
  •     
  • 它是一致的:对于任何非空引用值x和y,x.equals(y)的多次调用始终返回true或始终返回false,前提是没有修改在对象上的equals比较中使用的信息。
  •     
  • 对于任何非空引用值x,x.equals(null)应返回false。
  •     
  

我们可以推断x.equals(z)必须为false。

证明,如果equals()是传递和对称的,则x.equals(y)为false且y.equals(z)为真:

1)假设x.equals(z)为真;
2)z.equals(y)为真(对称);
1 + 2)x.equals(y)为真(传递1和2)

但x.equals(y)的值为false,因此数字1或数字2必须是错误的,即x.equals(z)为false或函数不对称。

但如果equals()没有实现对称,你就不能说结果x.equals(z)(参见其他答案;我对@Stephen C的评论答案)

答案 1 :(得分:2)

好:

x ≢ y
y ≡ z

因为equals()是可传递的,所以你可以用z代替y:

x ≢ z

因此,x.equals(z)为假。

编辑:它只是归结为布尔逻辑,它也是可传递的。

答案 2 :(得分:1)

@Colin HEBERT已经回答了这个问题。我只想指出OP混乱的可能来源。

这里实际上有两种不同的关系:

  • EQ关系(即x.equals(y) == true)具有传递性。

  • NE关系(即x.equals(y) == false)不具有传递性。

此外,传递属性只允许您推理涉及一个关系的链;即x EQ y && y EQ Z implies x EQ Z。该问题尝试使用及物性来推理x NE y && y EQ z ...并且它不适用于该情况。

答案 3 :(得分:0)

只有两个主要的场景:

  1. x.equals(y)的

    y.equals(x)
    if x.equals(z) then y.equals(z), z.equals(x), z.equals(y)
    if !x.equals(z) then !y.equals(z), !z.equals(x), !z.equals(y)
    
  2. !x.equals(y)的

    !y.equals(x)
    if x.equals(z) then !y.equals(z), z.equals(x), !z.equals(y)
    if !x.equals(z) then !z.equals(x) // you can't know the rest for sure
    

答案 4 :(得分:0)

TO @Colin HEBERT: 这里的假设是equals()方法确实遵守等价关系契约。 因此,对于x和y对象,如果x.equals(y)返回false,则y.equals(x)也为false。这是它们之间的对称关系。现在为了传递性,如果我们有另一个对象z和y.equals(z)为真。 x.equals(z)应该在这个等价关系的上下文中返回什么,其中x.equals(y)和y.equals(x)返回false,为什么?