比较器接口的equals方法,为什么总是安全的不覆盖Object.equals(Object)

时间:2018-04-12 02:05:04

标签: java equals comparator

我目前正在研究Comparator界面,并注意到在Comparator's equals方法的文档中,它声明了

  

请注意,不要覆盖Object.equals(Object)

总是安全的

enter image description here

我已检查equals

中默认Object方法的实现

enter image description here

因此,使用equals方法的默认实现,它只是检查两个实例是否指向同一个对象,因为this == obj测试引用相等性。

但如果我有两个Comparator个实例会发生什么,他们返回的结果是相同的,我想知道它们是否相同。如果我不重写默认的Object's equals方法,那么无论它们返回的结果是否相同,通过使用默认的Object's equals方法,将始终返回false。那么它仍然总是安全的不覆盖Object.equals(对象)

1 个答案:

答案 0 :(得分:3)

我想你错误地解释了java doc所说的内容:

  

如果指定的对象也是比较器并且它与此比较器具有相同的顺序, 可以返回true

默认实现将返回true only 如果它是完全相同的对象,根据定义,它们两者(实际上是单个)提供相同的排序顺序

这个定义并不意味着它会为不同的比较器返回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
    }
}

如果比较器等效,默认实现可以返回true,可以返回false(如果对象不同)

进一步注意,doc说:

  

但是,在某些情况下,覆盖此方法可能会通过允许程序确定两个不同的比较器强加相同的顺序来提高性能。

所以,不要覆盖是安全的,但这不足以保证不同但等效的比较器能够正确比较