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
,但这不是一个要求。感谢您的澄清!我想我现在明白了。很难阅读和理解文档,因为它们的措辞非常简洁。谢谢你的帮助!