gpt4 book ai didi

java - Comparator 和 Comparable 中的compare 和compareTo 方法的契约

转载 作者:行者123 更新时间:2023-12-01 11:56:19 25 4
gpt4 key购买 nike

在实现ComparatorComparable接口(interface)时,是否需要确保:

如果

  • x.compare(对象 obj1, 对象 obj2) == x.compare(对象 obj3, 对象 obj2)

  • obj1.compareTo(obj2) == obj3.compareTo(obj2) ,

那么obj1.equals(obj3)必须是true

最佳答案

不一定。

您所描述的是 transitive relation三个给定对象之间,以及 as far as both of the interfaces就相关而言,使用它们时的关系必须在它们之间是可传递的。

这就是说,给定三个相互可比较的类 ABC,如果 A .compareTo(B) == 0 && B.compareTo(C) == 0,然后 A.compareTo(C) == 0。同样的原理也适用于Comparator

您现在混淆的是 compareToequals 之间的区别。虽然这两者密切相关,但没有任何东西可以强制执行 very strong recommendation文档中提供:

It is strongly recommended, but not strictly required that (x.compareTo(y)==0) == (x.equals(y)). Generally speaking, any class that implements the Comparable interface and violates this condition should clearly indicate this fact. The recommended language is "Note: this class has a natural ordering that is inconsistent with equals."

equals 定义与 compareTo 甚至 compare 不一致当然是可能且有效的,但这取决于程序的性质,它可能会导致隐蔽的错误。如果您发现自己处于需要同时依赖 equalscompareTo(或 compare)的情况,请记录下来并与它的用法。

关于java - Comparator 和 Comparable 中的compare 和compareTo 方法的契约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28423577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com