我目前正在学习Comparator
接口并注意到在文档中比较器等于 https://docs.oracle.com/javase/9/docs/api/java/util/Comparator.html#equals-java.lang.Object-方法,它指出
请注意,不重写 Object.equals(Object) 始终是安全的
我已经检查了默认的实现equals
中的方法Object
class
所以使用默认实现equals
方法,它只是检查两个实例是否指向同一个对象,因为this == obj
测试参考相等性。
但是如果我有两个实例会发生什么Comparator
,它们返回的结果是相同的,我想知道它们是否等价。如果我不覆盖默认值Object's equals
方法,那么无论它们返回的结果是否等价,都使用默认的Object's equals
方法,false
总会被退回。还这样吗始终安全,不要覆盖 Object.equals(Object)?
我想你误解了 javadoc 的意思:
这个方法can返回真only如果指定的对象也是一个比较器并且它施加与该比较器相同的顺序
默认实现将返回 trueonly如果它是完全相同的对象,根据定义这意味着它们(实际上是单个对象)提供相同的排序顺序
这个定义并不意味着它会为不同的比较器返回true,即使它们提供相同的排序顺序,简单验证:
import java.util.Comparator;
public class TestComparator {
static class Comparator1 implements Comparator<Integer> {
@Override
public int compare(final Integer o1, final Integer o2) {
return Integer.compare(o1, o2);
}
}
static class Comparator2 implements Comparator<Integer> {
@Override
public int compare(final Integer o1, final Integer o2) {
return Integer.compare(o1, o2);
}
}
public static void main(final String[] args) {
final Comparator1 c1 = new Comparator1();
final Comparator1 c11 = new Comparator1();
final Comparator2 c2 = new Comparator2();
System.out.println(c1.equals(c1)); // true
System.out.println(c1.equals(c11)); // false
System.out.println(c1.equals(c2)); // false
}
}
默认实现can如果比较器相等则返回 true,也是如此can返回 false(如果对象不同)
进一步注意,医生说:
但是,在某些情况下,重写此方法可能会通过以下方式提高性能:允许程序确定两个distinct比较器施加相同的顺序.
因此,不覆盖是安全的,但不足以保证正确比较不同但等效的比较器
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)