天天看點

java 引用類型集合排序_關于引用資料類型的排序(自然排序和客戶化排序)

關于引用資料類型的排序(自然排序和客戶化排序):

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——“動态綁定排序”。