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)前面二者是而且關係。接口