Comparable & Comparator 都是用來實現(xiàn)集合中元素的比較、排序的储矩。
Comparator位于包Java.util下,而Comparable位于包? java.lang下
Comparator 和 Comparable?
他們都是java的一個接口, 并且是用來對自定義的class比較大小的褂乍。
Comparable 是排序接口持隧。
即然實現(xiàn)Comparable接口的類支持排序,假設(shè)現(xiàn)在存在“實現(xiàn)Comparable接口的類的對象的List列表(或數(shù)組)”逃片,則該List列表(或數(shù)組)可以通過 Collections.sort(或 Arrays.sort)進(jìn)行排序屡拨。通過 x.compareTo(y) 來“比較x和y的大小”。
Comparator 是比較器接口。
我們?nèi)粜枰刂颇硞€類的次序呀狼,而該類本身不支持排序(即沒有實現(xiàn)Comparable接口)裂允;那么,我們可以建立一個“該類的比較器”來進(jìn)行排序赠潦。這個“比較器”只需要實現(xiàn)Comparator接口即可叫胖。也就是說草冈,我們可以通過“實現(xiàn)Comparator類來新建一個比較器”她奥,然后通過該比較器對類進(jìn)行排序。通過compare(T o1, T o2) 是“比較o1和o2的大小”怎棱。
什么是自定義class:?
如 public class Person{ String name; int age }.
當(dāng)我們有這么一個personList,里面包含了person1, person2, persion3....., 我們用Collections.sort( personList ),
是得不到預(yù)期的結(jié)果的. 這時肯定有人要問, 那為什么可以排序一個字符串list呢:那是因為
String 這個對象已經(jīng)幫我們實現(xiàn)了 Comparable接口 , 所以我們的 Person 如果想排序, 也要實現(xiàn)一個比較器哩俭。
Comparator 和 Comparable 的區(qū)別
Comparable 定義在 Person類的內(nèi)部:
public class Persion implements Comparable {..比較Person的大小..},
因為已經(jīng)實現(xiàn)了比較器,那么我們的Person現(xiàn)在是一個可以比較大小的對象了,它的比較功能和String完全一樣,可以隨時隨地的拿來
比較大小,因為Person現(xiàn)在自身就是有大小之分的。Collections.sort(personList)可以得到正確的結(jié)果拳恋。
Comparator 是定義在Person的外部的, 此時我們的Person類的結(jié)構(gòu)不需要有任何變化,如
public class Person{ String name; int age },
然后我們另外定義一個比較器:
public PersonComparator implements Comparator() {..比較Person的大小..},
在PersonComparator里面實現(xiàn)了怎么比較兩個Person的大小. 所以,用這種方法,當(dāng)我們要對一個 personList進(jìn)行排序的時候,
我們除了要傳遞personList過去, 還需要把PersonComparator傳遞過去,因為怎么比較Person的大小是在PersonComparator
里面實現(xiàn)的, 如:Collections.sort( personList , new PersonComparator() ).
總結(jié):
Comparable是排序接口凡资;若一個類實現(xiàn)了Comparable接口,就意味著“該類支持排序”谬运。
而Comparator是比較器隙赁;我們?nèi)粜枰刂颇硞€類的次序,可以建立一個“該類的比較器”來進(jìn)行排序梆暖。
我們不難發(fā)現(xiàn):Comparable相當(dāng)于“內(nèi)部比較器”伞访,而Comparator相當(dāng)于“外部比較器”。
http://blog.csdn.net/u013256816/article/details/50899416
http://www.cnblogs.com/sunflower627/p/3158042.html
http://blog.csdn.net/mageshuai/article/details/3849143
http://www.cnblogs.com/skywang12345/p/3324788.html