最近學習集合框架中經常看到comparable和comparator接口,也是用到就用,沒多去了解他們的區別,最後需要區分的時候卻是懵了大一圈,學習還是要一絲不苟啊。現在我就記錄下思路和小結,便於日後複習。
Comparable
Comparable可以認爲是一個內比較器,實現了Comparable接口的類有一個特點,就是這些類是可以和自己比較的,至於具體和另一個實現了Comparable接口的類如何比較,則依賴compareTo方法的實現,compareTo方法也被稱爲自然比較方法。若一個類實現了Comparable接口,就意味着該類支持排序。實現了Comparable接口的類的對象的列表或數組可以通過Collections.sort或Arrays.sort進行自動排序。
compareTo方法的返回值是int,有三種情況:
1、比較者大於被比較者(也就是compareTo方法裏面的對象),那麼返回正整數
2、比較者等於被比較者,那麼返回0
3、比較者小於被比較者,那麼返回負整數
現在我們假設一個Person類,代碼如下:
public class Person implements Comparable<Person> //實現了Comparable接口
{
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) //複寫了compareTo方法,即可自定義對象的比較
{
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());
}
}
}
結果:
排序前:
xujian:20xiewei:10
排序後:
xiewei:10xujian:20
Comparator
Comparator可以認爲是是一個外比較器,個人認爲有兩種情況可以使用實現Comparator接口的方式:
1、一個對象不支持自己和自己比較(沒有實現Comparable接口),但是又想對兩個對象進行比較
2、一個對象實現了Comparable接口,但是開發者認爲compareTo方法中的比較方式並不是自己想要的那種比較方式
Comparator接口裏面有一個compare方法,方法有兩個參數T o1和T o2,是泛型的表示方式,分別表示待比較的兩個對象,方法返回值和Comparable接口一樣是int,有三種情況:
1、o1大於o2,返回正整數
2、o1等於o2,返回0
3、o1小於o3,返回負整數
現在假如上面的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());
}
}
}
程序運行結果爲:排序前:
xujian:20xiewei:10
排序後:
xiewei:10xujian:20
總結
總結一下,兩種比較器Comparable和Comparator,後者相比前者有如下優點:
1、如果實現類沒有實現Comparable接口,又想對兩個類進行比較(或者實現類實現了Comparable接口,但是對compareTo方法內的比較算法不滿意),那麼可以實現Comparator接口,自定義一個比較器,寫比較算法
2、實現Comparable接口的方式比實現Comparator接口的耦合性 要強一些,如果要修改比較算法,要修改Comparable接口的實現類,而實現Comparator的類是在外部進行比較的,不需要對實現類有任何修 改。從這個角度說,其實有些不太好,尤其在我們將實現類的.class文件打成一個.jar文件提供給開發者使用的時候。