Comparable是排序接口。若一個類實現了Comparable接口,就意味着該類支持排序。實現了Comparable接口的類的對象的列表或數組能夠經過Collections.sort或Arrays.sort進行自動排序。此外,實現此接口的對象能夠用做有序映射中的鍵或有序集合中的集合,無需指定比較器。該接口定義以下:數組
public class Field implements Comparable<Field> { private String name; private int age; public Field(String name,int age){ this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int compareTo(Field o) { //先比較age if(this.age > o.age){ return this.age - o.age; } if(this.age < o.age){ return this.age - o.age; } //再根據name進行比較 if(this.name.compareTo(o.name) > 0){ return 1; } if(this.name.compareTo(o.name) < 0){ return -1; } return 0; } }
測試類ide
public class ComparableTest { public static void main(String[] args){ Field field1 = new Field("field1",18); Field field2 = new Field("field2",18); Field field3 = new Field("field3",23); Field field4 = new Field("field4",16); List<Field> list = Lists.newArrayList(); list.add(field1); list.add(field2); list.add(field3); list.add(field4); //排序 Collections.sort(list); for(Field field : list){ System.out.println(field.getName()+" =="+field.getAge()); } } }
輸出結果函數
Comparator是比較接口,咱們若是須要控制某個類的次序,而該類自己不支持排序(即沒有實現Comparable接口),那麼咱們就能夠創建一個"該類的比較器"來進行排序,這個"比較器"只須要實現Comparator接口便可。也就是說,咱們能夠經過實現Comparator來新建一個比較器,而後經過這個比較器進行排序。該接口定義以下:測試
public class Person { private String name; private int age; public Person(String name, int age){ this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
上面的Person類沒有實現Comparable接口,該如何比較大小呢?咱們能夠新建一個類,讓其實現Comparator接口,從而構造一個"比較器"。this
若一個類要實現Comparator接口:它必定要實現compare(T o1,T 02)函數,但能夠不實現equals(Object obj)函數。code
int compare(T o1,T o2)是"比較o1和o2的大小"。返回"負數",意味着"o1比o2小";返回"零",意味着"o1等於o2";返回"正數",意味着"o1大於o2"。對象
咱們新建一個類,讓其實現Comparator接口,從而構造一個"比較器"。排序
public class PersonComparator implements Comparator<Person> { @Override public int compare(Person t1, Person t2) { //先比較age if(t1.getAge() > t2.getAge()){ return t1.getAge() - t2.getAge(); } if(t1.getAge() < t2.getAge()){ return t1.getAge() - t2.getAge(); } //再根據name進行比較 if(t1.getName().compareTo(t2.getName()) > 0){ return 1; } if(t1.getName().compareTo(t2.getName()) < 0){ return -1; } return 0; } }
測試類接口
public class ComparableTest { public static void main(String[] args){ Person person1 = new Person("person1",18); Person person2 = new Person("person2",18); Person person3 = new Person("person3",23); Person person4 = new Person("person4",16); List<Person> list = Lists.newArrayList(); list.add(person1); list.add(person2); list.add(person3); list.add(person4); //排序 Collections.sort(list,new PersonComparator()); for(Person person : list){ System.out.println(person.getName()+" =="+person.getAge()); } } }
程序運行結果 圖片
3、Comparable和Comparator區別比較 兩種方法各有優劣, 用Comparable 簡單, 只要實現Comparable 接口的對象直接就成爲一個能夠比較的對象,可是須要修改源代碼。 用Comparator 的好處是不須要修改源代碼, 而是另外實現一個比較器, 當某個自定義的對象須要做比較的時候,把比較器和對象一塊兒傳遞過去就能夠比大小了, 而且在Comparator 裏面用戶能夠本身實現複雜的能夠通用的邏輯,使其能夠匹配一些比較簡單的對象,那樣就能夠節省不少重複勞動了。