Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较器接口';s equals方法,为什么不重写Object总是安全的。equals(Object)_Java_Equals_Comparator - Fatal编程技术网

Java 比较器接口';s equals方法,为什么不重写Object总是安全的。equals(Object)

Java 比较器接口';s equals方法,为什么不重写Object总是安全的。equals(Object),java,equals,comparator,Java,Equals,Comparator,我目前正在研究Comparator接口,并注意到在方法的文档中,它指出 请注意,不重写Object.equals(Object)总是安全的 我已经检查了Object类中默认equals方法的实现 因此,对于equals方法的默认实现,它只是检查两个实例是否指向同一个对象,因为this==obj测试引用相等性 但是,如果我有两个Comparator实例,它们返回的结果是相同的,我想知道它们是否相等。如果我不重写默认的对象的equals方法,那么无论它们返回的结果是否相等,通过使用默认的对象的e

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

请注意,不重写Object.equals(Object)总是安全的

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

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


但是,如果我有两个
Comparator
实例,它们返回的结果是相同的,我想知道它们是否相等。如果我不重写默认的
对象的equals
方法,那么无论它们返回的结果是否相等,通过使用默认的
对象的equals
方法,
false
将始终返回。因此,不重写对象是否总是安全的。equals(Object)

如果指定的对象也是一个比较器,并且它施加了与此比较器相同的顺序,则此方法只能返回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
    }
}
import java.util.Comparator;
公共类测试比较器{
静态类Comparator1实现Comparator{
@凌驾
公共整数比较(最终整数o1,最终整数o2){
返回整数。比较(o1,o2);
}
}
静态类Comparator2实现Comparator{
@凌驾
公共整数比较(最终整数o1,最终整数o2){
返回整数。比较(o1,o2);
}
}
公共静态void main(最终字符串[]args){
最终比较器1 c1=新比较器1();
最终比较器1 c11=新比较器1();
最终比较器2 c2=新比较器2();
System.out.println(c1.equals(c1));//真
System.out.println(c1.equals(c11));//false
System.out.println(c1.equals(c2));//false
}
}
如果比较器等效,默认实现可以返回true,如果对象不同,默认实现也可以返回false

进一步注意,doc说:

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


因此,不重写是安全的,但不足以保证正确比较不同但等效的比较器

您永远不应该期望比较器重写
equals()
。这只是一种可能的优化。@shmosel所以比较
比较器的两个实例并返回
false
,即使它们的实现是相同的,也可以。如果它们是
==
,则不可以。好的,谢谢您的帮助:)一个
Comperator
是一种对某些对象进行“排序”的方法。它有一些要求:要么一个对象“小于”另一个对象,要么“大于”另一个对象,要么相等<如果
Comperator
返回0(两个对象相等),则code>equal
应返回
true
,但这不是一个要求。感谢您的澄清!我想我现在明白了。很难阅读和理解文档,因为它们的措辞非常简洁。谢谢你的帮助!