我目前正在研究Comparator
接口,并注意到在Comparator的equals方法的文档中,它指出
请注意,始终不要覆盖Object.equals(Object)是始终安全的
我已经检查了类中默认equals
方法的实现Object
因此,使用equals
method 的默认实现,它仅检查两个实例是否指向同一个对象,因为要this == obj
测试引用是否相等。
但是如果我有两个实例Comparator
,它们返回的结果是相同的,并且我想知道它们是否相等,会发生什么。如果我不重写默认Object's equals
方法,则无论使用默认Object's equals
方法返回的结果是否相等,false
都将始终返回。因此,不重写Object.equals(Object)仍然总是安全的吗?
我想您会误解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] 删除。
我来说两句