關于引用資料類型的排序(自然排序和客戶化排序):
1.對象本身實作Comparable接口,那麼該類的執行個體就是可以排序的(實作其comparTo()方法).
隻要實作了Comparable接口,就可以調用Collections的sort方法對集合中的元素排序.
2.實作Comparator接口的一個執行個體也可以實作排序功能.
看一下Comparator的全部内容:
public interface Comparator {
int compare(Object o1, Object o2);
boolean equals(Object obj);
}
定義了兩個方法,我們一般都隻需要實作compare方法。
為什麼呢?
因為所有自定義類預設extends Object,而Object中已經将equals()實作
Comparator一般都作為一個匿名類出現,對于沒有實作Comparable的對象的集合,排序的時候
需要指定一個Comparator.
這裡舉例說明
對于實作了Comparable的類(自然排序)我們就用最簡單的Integer
List list=new ArrayList();
list.add(new Integer(3));
list.add(new Integer(53));
list.add(new Integer(34));
Collections.sort(list);
對于沒有實作Comparable的,我們就用Object,按照hashCode大小來排序.
List list= new ArrayList();
list.add(new Object());
list.add(new Object());
list.add(new Object());
Collections.sort(list,new Comparator(){ public int compare(Object o1, Object o2){
return (o1.hashCode()-o2.hashCode());
})
這裡定義了一個排序規則,以匿名類的形式出現,當然你也可以定義一個自定義的類實作Comparator,
這樣這個“排序規則”就能得以儲存。
那Comparable 和 Comparator 接口有什麼差別呢?
“白話文”的解釋:用自定義類實作Comparable接口,那麼這個類就具有排序功能,Comparable和具體你要進行排序的類的執行個體邦定。而Comparator比較靈活,它沒有和任何類綁定,實作它的自定義類僅僅定義了一種排序方式或排序規則。不言而喻,這種方式比較靈活。我們的要排序的類可以分别和多個實作Comparator接口的類綁定,進而達到可以按自己的意願實作按多種方式排序的目的。Comparable——“靜态綁定排序”,Comparator——“動态綁定排序”。