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

Comparator interface's equals method, why it is always safe not to override Object.equals(Object)

我目前正在研究 Comparator 接口并注意到在 Comparator's equals 方法的文档中,它指出

Note that it is always safe not to override Object.equals(Object)

我检查了 Object class

中默认 equals 方法的实现

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

但是如果我有两个 Comparator 的实例,结果它们 return 是相同的,我想知道它们是否等价。如果我不重写默认的 Object's equals 方法,那么不管他们 return 的结果是否等价,通过使用默认的 Object's equals 方法, false 将永远是 return编辑。那么不覆盖 Object.equals(Object) 是否仍然 总是安全的?

我想你误解了 java 医生所说的内容:

this method can return true only if the specified object is also a comparator and it imposes the same ordering as this comparator

默认实现 return true 如果它是完全相同的对象,根据定义,这意味着它们(实际上是单个对象)提供相同的排序顺序

这个定义并不意味着它会return适用于不同的比较器,即使它们提供相同的排序顺序,简单验证:

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 return true 如果比较器等效,它 can return false(如果对象不同)

进一步注意,文档说:

However, overriding this method may, in some cases, improve performance by allowing programs to determine that two distinct comparators impose the same order.

因此,不覆盖是安全的,但不足以保证不同但等效的比较器将被正确比较