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

雷神 :

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

请注意,始终不要覆盖Object.equals(Object)是始终安全的

在此处输入图片说明

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

在此处输入图片说明

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

但是如果我有两个实例Comparator,它们返回的结果是相同的,并且我想知道它们是否相等,会发生什么。如果我不重写默认Object's equals方法,则无论使用默认Object's equals方法返回的结果是否相等false都将始终返回。因此,不重写Object.equals(Object)仍然总是安全的吗?

伊利亚·伯索夫(IłyaBursov):

我想您会误解java doc在说什么:

当指定的对象也是一个比较器并且它施加与该比较器相同的顺序时,此方法才能返回true

默认实现只有在完全相同的对象时才返回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(如果对象不同)。

请进一步注意,文档说:

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

因此,可以安全地避免覆盖,但不足以保证可以正确比较不同但等效的比较器

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java重写Object equals()方法

从java ... Object类重写equals方法

在类外重写Object#equals(Object)

Objects.equals和Object.equals

我应该重写Object.equals(Object)方法吗?

为什么在String类中将equals方法定义为equals(Object anObject)而不将其定义为equals(String anObject)?

为什么Java的Area#equals方法不能覆盖Object#equals?

Object.Equals的奇怪实现

equals(Object obj)有什么作用?

Java ArrayList不使用重写equals(Object o)方法进行比较

在Hashset或其他Collections中使用继承的对象时,为什么Equals(object)胜过Equals(T)?

EqualityComparerer <T> .Default.Equals()与object.Equals()和多态

为什么(object)0 ==(object)0与((object)0).Equals((object)0)不同?

为什么 Object.Equals 的参数不是“输入”(输入)?

为什么Object.equals()的实现不使用hashCode()?

为什么object.equals(new Integer(1))等于true?

为什么SparseIntArray.equals(Object)不起作用?

为什么ArrayList不重写equals()以获得更好的性能?

List.equals()在重写java.lang.Object.equals()时是否执行了预期的行为?

在重写对象之后使用Object的hashCode()和equals()实现

覆盖Object.equals VS重载它

Object.Equals() 是如何“最终”实现的?

为什么对于equals方法我们需要一个Object参数?

Java为什么不将.equals(Object)方法的Java自动装箱成integer?

为什么我们在 HashMap 和 HashSet 中使用 equals() 方法而不实现比较器接口?

equals(Object o)和equals(Name o)之间有什么有意义的区别吗?

为什么(((object)(int)1).Equals((((object)(ushort)1)))产生false?

Java的equals(Object o)函数有什么用

IEquatable和仅重写Object.Equals()有什么区别?