關於:Comparable

java.lang 接口 Comparable< T >

先看一些官方API 怎麼說:

  此接口強行對實現它的每個類的對象進行整體排序。這種排序被稱爲類的自然排序,類的 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)}。


下面是個人理解,有理解不到位的請輕拍:

  • 簡單使用
//數組
Student[] stu = {new Student(1,"1"),new Student(3,"3"),new Student(2,"2")};
Arrays.sort(stu);
for (Student ss : stu){
    System.out.println(ss);
}
System.out.println("-------我是分割線-------");
//集合
List<Student> list  = new ArrayList<>();
list.add(new Student(1,"1"));
list.add(new Student(3,"3"));
list.add(new Student(2,"2"));
list.sort(null);
// 或 Collections.sort(list);
for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

//需要進行比較的實體,實現 Comparable 接口
public class Student implements Comparable<Student>{

    @Override
    public int compareTo(Student o) {
        return this.getId() - o.getId();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章