Comparable和Comparator都是用來實現集合中元素的比較、排序的,只是Comparable 是在集合內部定義的方法實現的排序,Comparator 是在集合外部實現的排序,所以,如想實現排序,就需要在集合外定義 Comparator 接口的方法或在集合內實現 Comparable 接口的方法。
Comparator位於包java.util下,而Comparable位於包 java.lang下.
Comparable 是一個對象本身就已經支持自比較所需要實現的接口(如 String、Integer 自己就可以完成比較大小操作,已經實現了Comparable接口)
自定義的類要在加入list容器中後能夠排序,可以實現Comparable接口,在用Collections類的sort方法排序時,如果不指定Comparator,那麼就以自然順序排序,如API所說:
Sorts the specified list into ascending order, according to the natural ordering of its elements. All elements in the list must implement the Comparable interface
這裡的自然順序就是實現Comparable接口設定的排序方式。
而 Comparator 是一個專用的比較器,當這個對象不支持自比較或者自比較函數不能滿足你的要求時,你可以寫一個比較器來完成兩個對象之間大小的比較。
可以說一個是自已完成比較,一個是外部程序實現比較的差別而已。
用 Comparator 是策略模式(strategy design pattern),就是不改變對象自身,而用一個策略對象(strategy object)來改變它的行為。
例如我們定義一個類Country,我們希望他的對象有大小關系,且依據countryId來排序的,所以我們讓Country實現Comparable接口,使其具備大小關系的能力,代碼如下:
class Country implements Comparable{
private int countryId ;
@Override
public int compareTo(Object o) {
Country country = (Country)o ;
return this.getCountryId()>country.getCountryId()?1:this.getCountryId()==
country.getCountryId()?0:-1 ;
}
}
此時Country就具備了比較的能力了,如同Integer,String類一樣,此時Country對象的集合就可以通過Collections.sort(),或者Arrays.sort(),來進行排序了。
下面我們來看看Comparator使如何實現的。
就像我們之前說的一樣,Comparator其實就好像一個工具,它不是使得Country具有排序性,而是他不改變Country類本身,而是單獨實現一個排序工具,來提供給Country用,下面我們就來實現這個排序工具類。
class Country{
private int id ;
public Country(int id){
this.id = id ;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
class CountryByIdComparator implements Comparator{
@Override
public int compare(Country o1, Country o2) {
return o1.getId()>o2.getId()?1:o1.getId()==o2.getId()?0:-1 ;
}
}
大家注意到沒,單單看Country類,其實並沒有跟比較有任何關系,但是它卻能通過實現Comparator借口的工具類ContryByIdComparator來實現自動排序。此時調用的Collections.sort()就需要兩個參數了,一個是集合,一個是實現Comparator接口的工具類。
我們也可以利用匿名內部類來實現,而不需要單獨定義ContryByIdComparator這樣一個工具類,代碼如下:
Collections.sort(cityList,new Comparator(){
@Override
public int compare(City o1, City o2) {
return o1.getId()>o2.getId()?1:o1.getId()==o2.getId()?0:-1 ;
}
}) ;
Comparator 是策略模式(strategy design pattern),就是不改變對象自身,而用一個策略對象(strategy object)來改變它的行為。
下面這張圖就是它們兩的區別:
Refference
2014-11-16 17:27:25
Brave,Happy,Thanksgiving !