第12條: 考慮實現Comparable接口

CompareTo方法沒有在Object中聲明,它是Comparable接口中的惟一的方法,不但容許進行簡單的等同性比較,並且容許執行順序比較。類實現了Comparable接口,就代表它的實例具備內在的排序關係。爲實現Comparable接口的對象排序就這麼簡單:Arrays.sort(a);算法

實現Comparable好處在於:一旦實現了Comparable接口,它能夠跟許多泛型算法以及依賴於該接口的集合實現進行協做,只需付出很小的努力就能夠得到很是強大的功能。
Java平臺的全部值類都實現了Comparable接口。若是一個類具備明顯的內在排序關係,好比按字母順序,按數字順序,按年代順序,就應該實現這個接口。數組

CompareTo方法的通用約定:this

  將這個對象與指定的對象進行比較。當該對象小於、等於、大於指定對象的時候,分別返回一個負整數、零或者正整數。若是因爲指定對象的類型而沒法與該對象進行比較,則拋出ClassCastException異常。spa

如何很好的實現Comparable接口,根據CompareTo方法的通用約定咱們能夠總結出如下四點:
  (1)知足對稱性。
    即對象A.comparaTo(B) 大於0的話,則B.comparaTo(A)必須小於0;
  (2)知足傳遞性。
    即對象A.comparaTo(B) 大於0,對象B.comparaTo(Z)大於0,則對象A.comparaTo(Z)必定要大於0;
  (3)建議comparaTo方法和equals()方法保持一致。
    即對象A.comparaTo(B)等於0,則建議A.equals(B)等於true。
  (4)對於實現了Comparable接口的類,儘可能不要繼承它,而是採起復合的方式。
  (5)一個建議,考慮BigDecimal類,它的compareTo方法和equals不一致,若是建立HashSet實例,並添加new BigDecimal("1.0") 和 new BigDecimal("1.00"),這個集合就將包含兩個元素,由於HashSet經過equals比較是不相等的,然而,使用TreeSet來執行一樣的過程,集合只包含一個元素,由於它是經過compareTo方法進行比較的。下面看下簡單的comparTo例子:code

public class Person implements Comparable<Person>{
    private String name;
    private int age;
    private char sex;
    
    public Person(){}
    
    public Person(String name, int age, char sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    //String  Integer等實現了Comparable,因此字符串這些比較能夠用它們重寫的方法compareTo(),如「abc」.compareTo(「bcd」);會返回正反表示大小,0爲相等
    public int compareTo(Person o) {
        //比較名字
        if(o.getName() == null || this.name == null){
            return -1;
        }
        return this.name.compareTo(o.getName());  //升序
    
        //按照年齡排序
        //return this.age - o.getAge();  //升序
    }
    public String toString(){
        return this.name +"---"+this.age;
    }
       //getter、setter方法...
}
 public static void main(String[] args) {
        //根據姓名排序
        List<Person> list = new ArrayList<Person>();//初始化一個list
        list.add(new Person("b", 11, 'M'));
        list.add(new Person("a", 10, 'M'));
        list.add(new Person("c", 12, 'W'));
        Collections.sort(list); //集合排序,就是這麼簡單
        System.out.println(list);
        
        //根據age排序
        //將註釋return this.age - o.getAge();去掉,把上面的註釋掉
        Person[] array = new Person[]{new Person("aa", 21, 'M'),new Person("c", 11, 'M'),new Person("d", 31, 'M')};//初始化一個數組
        Arrays.sort(array); //數組排序,就是這麼簡單
        System.out.println(Arrays.toString(array));
 }

  

好了,上面的comparable例子很簡單吧。對象

總結:何時應該考慮實現Comparable接口blog

  (1)你寫的類是一個值類(前面的文章介紹過)。排序

  (2)類中有很明顯的內在排序關係,如字母排序、按數值順序或是時間等。繼承

  (3)前面二者是而且關係。接口

相關文章
相關標籤/搜索