分享

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

 印度阿三17 2019-06-27

我目前正在研究Comparator接口,并注意到在Comparator’s equals方法的文档中,它说明了

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

enter image description here

我已经检查了Object类中默认equals方法的实现

enter image description here

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

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

解决方法:

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

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

只有当它完全是同一个对象时,默认实现才会返回true,根据定义,它们都表示它们(实际上是单个)提供相同的排序顺序

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

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

因此,不使用覆盖是安全的,但仅仅保证不同但等效的比较器将被正确比较是不够的

来源:https://www./content-1-272851.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多