![](/img/trans.png)
[英]Why doesn't this equals method properly override the object.equals method?
[英]Comparator interface's equals method, why it is always safe not to override Object.equals(Object)
我目前正在研究Comparator
接口,並注意到在Comparator的equals方法的文檔中,它指出
請注意,不要覆蓋Object.equals(Object)總是安全的
我已經檢查了Object
類中默認equals
方法的實現
因此,使用equals
方法的默認實現,它只是檢查兩個實例是否指向同一個對象,因為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(如果對象不同)
請注意,doc說:
但是,在某些情況下,通過允許程序確定兩個不同的比較器強加相同的順序 ,覆蓋此方法可以提高性能。
因此,不使用覆蓋是安全的,但僅僅保證不同但等效的比較器將被正確比較是不夠的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.