簡體   English   中英

比較器接口的equals方法,為什么總是安全的不覆蓋Object.equals(Object)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM