Comparable是排序接口。若一個類實現了Comparable接口,就意味着該類支持排序。實現了Comparable接口的類的對象的列表或數組能夠經過Collections.sort或Arrays.sort進行自動排序。html
此外,實現此接口的對象能夠用做有序映射中的鍵或有序集合中的集合,無需指定比較器。該接口定義以下:java
package java.lang; import java.util.*; public interface Comparable<T>
{ public int compareTo(T o); }
T表示能夠與此對象進行比較的那些對象的類型。數組
此接口只有一個方法compare,比較此對象與指定對象的順序,若是該對象小於、等於或大於指定對象,則分別返回負整數、零或正整數。ide
如今咱們假設一個Person類,代碼以下:函數
public class Person { String name; int age; public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; }
public int getAge() { return age; } }
如今有兩個Person類的對象,咱們如何來比較兩者的大小呢?咱們能夠經過讓Person實現Comparable接口:this
public class Person implements Comparable<Person> { String name; int age; public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public int compareTo(Person p) { return this.age-p.getAge(); } public static void main(String[] args) { Person[] people=new Person[]{new Person("xujian", 20),new Person("xiewei", 10)}; System.out.println("排序前"); for (Person person : people) { System.out.print(person.getName()+":"+person.getAge()); } Arrays.sort(people); System.out.println("\n排序後"); for (Person person : people) { System.out.print(person.getName()+":"+person.getAge()); } } }
程序執行結果爲:spa
Comparator是比較接口,咱們若是須要控制某個類的次序,而該類自己不支持排序(即沒有實現Comparable接口),那麼咱們就能夠創建一個「該類的比較器」來進行排序,這個「比較器」只須要實現Comparator接口便可。也就是說,咱們能夠經過實現Comparator來新建一個比較器,而後經過這個比較器對類進行排序。該接口定義以下:code
package java.util; public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); }
注意:一、若一個類要實現Comparator接口:它必定要實現compare(T o1, T o2) 函數,但能夠不實現 equals(Object obj) 函數。htm
二、int compare(T o1, T o2) 是「比較o1和o2的大小」。返回「負數」,意味着「o1比o2小」;返回「零」,意味着「o1等於o2」;返回「正數」,意味着「o1大於o2」。對象
如今假如上面的Person類沒有實現Comparable接口,該如何比較大小呢?咱們能夠新建一個類,讓其實現Comparator接口,從而構造一個「比較器"。
public class PersonCompartor implements Comparator<Person> { @Override public int compare(Person o1, Person o2) { return o1.getAge()-o2.getAge(); } }
如今咱們就能夠利用這個比較器來對其進行排序:
public class Person { String name; int age; public Person(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } public static void main(String[] args) { Person[] people=new Person[]{new Person("xujian", 20),new Person("xiewei", 10)}; System.out.println("排序前"); for (Person person : people) { System.out.print(person.getName()+":"+person.getAge()); } Arrays.sort(people,new PersonCompartor()); System.out.println("\n排序後"); for (Person person : people) { System.out.print(person.getName()+":"+person.getAge()); } } }
程序運行結果爲:
Comparable是排序接口,若一個類實現了Comparable接口,就意味着「該類支持排序」。而Comparator是比較器,咱們若須要控制某個類的次序,能夠創建一個「該類的比較器」來進行排序。
Comparable至關於「內部比較器」,而Comparator至關於「外部比較器」。
兩種方法各有優劣, 用Comparable 簡單, 只要實現Comparable 接口的對象直接就成爲一個能夠比較的對象,可是須要修改源代碼。 用Comparator 的好處是不須要修改源代碼, 而是另外實現一個比較器, 當某個自定義的對象須要做比較的時候,把比較器和對象一塊兒傳遞過去就能夠比大小了, 而且在Comparator 裏面用戶能夠本身實現複雜的能夠通用的邏輯,使其能夠匹配一些比較簡單的對象,那樣就能夠節省不少重複勞動了。