對Comparable接口的困惑!

public interface Comparable<T>

 此接口強行對實現它的每個類的對象進行整體排序。這種排序被稱爲類的自然排序,類的 compareTo 方法被稱爲它的自然比較方法。

實現此接口的對象列表(和數組)可以通過 Collections.sort(和 Arrays.sort)進行自動排序。實現此接口的對象可以用作有序映射中的鍵或有序集合中的元素,無需指定比較器。

對於類 C 的每一個 e1 和 e2 來說,當且僅當 e1.compareTo(e2) == 0 與 e1.equals(e2) 具有相同的 boolean 值時,類 C 的自然排序才叫做與 equals 一致。注意,null 不是任何類的實例,即使 e.equals(null) 返回 false,e.compareTo(null) 也將拋出 NullPointerException。

 建議(雖然不是必需的)最好使自然排序與 equals 一致。這是因爲在使用自然排序與 equals 不一致的元素(或鍵)時,沒有顯式比較器的有序集合(和有序映射表)行爲表現“怪異”。尤其是,這樣的有序集合(或有序映射表)違背了根據 equals 方法定義的集合(或映射表)的常規協定。

例如,如果將兩個鍵 a 和 b 添加到沒有使用顯式比較器的有序集合中,使 (!a.equals(b) && a.compareTo(b) == 0),那麼第二個 add 操作將返回 false(有序集合的大小沒有增加),因爲從有序集合的角度來看,a 和 b 是相等的。

實際上,所有實現 Comparable 的 Java 核心類都具有與 equals 一致的自然排序。java.math.BigDecimal 是個例外,它的自然排序將值相等但精確度不同的 BigDecimal 對象(比如 4.0 和 4.00)視爲相等。

 從數學上講,定義給定類 C 上自然排序的關係式 如下:

{(x, y)|x.compareTo(y) <= 0}。

整體排序的商 是:

 {(x, y)|x.compareTo(y) == 0}。

它直接遵循 compareTo 的協定,商是 C 的等價關係,自然排序是 C 的整體排序。當說到類的自然排序與 equals 一致 時,是指自然排序的商是由類的 equals(Object) 方法定義的等價關係。

{(x, y)|x.equals(y)}。

 

上面是jdk的原話!

我寫了下面的程序:

 

package zhao;

import java.util.HashSet;
import java.util.Set;

public class Test1 implements Comparable<Test1> {

    
public static void main(String args[]) {
        Test1 t1 
= new Test1();
        Test1 t2 
= new Test1();
        Set
<Test1> set = new HashSet<Test1>();
        set.add(t1);
        set.add(t2);
        System.out.println(set);
    }


    @Override
    
public boolean equals(Object o) {
        
return false;

    }


    @Override
    
public int hashCode() {
        
return 100;
    }


    
public int compareTo(Test1 o2) {
        
return 0;
    }


}

 

按jdk的原話:加粗的地方

例如,如果將兩個鍵 ab 添加到沒有使用顯式比較器的有序集合中,使 (!a.equals(b) && a.compareTo(b) == 0),那麼第二個 add 操作將返回 false(有序集合的大小沒有增加),因爲從有序集合的角度來看,ab 是相等的。

我這個程序滿足這個條件,怎麼set的size還是2呢?

  麻煩閱讀者來解釋一下吧!謝謝了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章