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

发布于 2024-09-15 21:46:24 字数 145 浏览 5 评论 0原文

假设 equals() 是传递的; 我理解,如果 x 和 y 具有平等的双边协议,那么其中一个(例如 y)不会单独与第三类 z 签订协议。 但是,如果我们遇到 x.equals(y) = false(仍然具有传递性)的情况,那么与 z 的双边协议应该是什么?

Assuming equals() is transitive;
I understand that if x and y, have a bilateral agreement of being equal, then one of them, say y, does not enter into an agreement with a third class z on its own. But if we have a situation where x.equals(y) = false (still transitive) then what should this bilateral agreement with z be?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

滥情稳全场 2024-09-22 21:46:24

如果 equals 方法按照 Object 的 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)应返回 true
  • 它是一致的:对于任何非空引用值 x 和 y,如果对象的 equals 比较中使用的信息没有被修改,则多次调用 x.equals(y) 一致返回 true 或一致返回 false。
  • 对于任何非空引用值 x,x.equals(null) 应返回 false。

我们可以推断 x.equals(z) 一定是 false。

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

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

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

但是,如果 equals() 没有实现为对称的,那么您就无法对结果 x.equals(z) 说任何话(请参阅其他答案;我对 @Stephen C 答案的评论)

If the equals method is correctly implemented, as demanded by the javadoc of Object:

  • It is reflexive: for any non-null reference value x, x.equals(x) should return true.
  • It is symmetric: for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true.
  • It is transitive: for any non-null reference values x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return true.
  • It is consistent: for any non-null reference values x and y, multiple invocations of x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modified.
  • For any non-null reference value x, x.equals(null) should return false.

we can infer that x.equals(z) must be false.

Prove, if equals() is transitive and symmetric, x.equals(y) is false and y.equals(z) is true:

1) assuming x.equals(z) is true;
2) z.equals(y) is true (symmetry);
1+2) x.equals(y) is true (transitive 1 and 2)

but x.equals(y) is given as false, so number 1 or number 2 must be wrong, that is, x.equals(z) is false or the function is not symmetric.

But if equals() is not implemented to be symmetric, you can't say anything about the result x.equals(z) (see other answers; my comment on @Stephen C answer)

ゞ记忆︶ㄣ 2024-09-22 21:46:24

好吧:

x ≢ y
y ≡ z

由于 equals() 是传递性的,因此您可以将 y 替换为 z:

x ≢ z

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

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

Well:

x ≢ y
y ≡ z

since equals() is transitive, you can replace y with z:

x ≢ z

Therefore, x.equals(z) is false.

Edit: It just comes down to boolean logic, which is also transitive.

故事和酒 2024-09-22 21:46:24

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

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

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

  • NE 关系(即 x.equals(y) == false)是不可传递的。

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

@Colin HEBERT has answered this. I'd just like to point out a possible source of the OP's confusion.

There are actually two different relations here:

  • the EQ relation (i.e. x.equals(y) == true) is transitive.

  • the NE relation (i.e. x.equals(y) == false) is NOT transitive.

Furthermore, the transitivity property only allows you to reason about to chains involving one relation; i.e. x EQ y && y EQ Z implies x EQ Z. The question tries to use transitivity to reason about x NE y && y EQ z ... and it doesn't apply to that case.

丿*梦醉红颜 2024-09-22 21:46:24

只能有两种主要场景:

  1. x.equals(y)

    y.equals(x)
    如果 x.equals(z) 那么 y.equals(z), z.equals(x), z.equals(y)
    如果 !x.equals(z) 那么 !y.equals(z), !z.equals(x), !z.equals(y)
    
  2. !x.equals(y)

    !y.equals(x)
    如果 x.equals(z) 则 !y.equals(z), z.equals(x), !z.equals(y)
    if !x.equals(z) then !z.equals(x) // 你不能确定剩下的
    

There can be only two main scenarii:

  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
    
傲影 2024-09-22 21:46:24

致@科林·赫伯特:
这里的假设是 equals() 方法确实遵守等价关系契约。
因此,对于对象 x 和 y,如果 x.equals(y) 返回 false,则 y.equals(x) 也为 false。这就是它们之间的对称关系。现在对于传递性,如果我们有另一个对象 z 并且 y.equals(z) 为 true。在 x.equals(y) 和 y.equals(x) 返回 false 的等价关系上下文中,x.equals(z) 应该返回什么,为什么?

TO @Colin HEBERT:
The assumption here is that equals() method does abide by the contract of equivalence relation.
So for objects x and y if x.equals(y) returns false then y.equals(x) is also false. This is the symmetric relationship between them. Now for transitivity, if we have another object z and y.equals(z) is true. What should x.equals(z) return in context of this equivalence relation where x.equals(y) and y.equals(x) return false, and why?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文