Java中Comparable和Comparator介面區別分析
Comparable 簡介
Comparable 是排序介面。
若一個類實現了Comparable介面,就意味著“該類支援排序”。 即然實現Comparable介面的類支援排序,假設現在存在“實現Comparable介面的類的物件的List列表(或陣列)”,則該List列表(或陣列)可以通過 Collections.sort(或 Arrays.sort)進行排序。
此外,“實現Comparable介面的類的物件”可以用作“有序對映(如TreeMap)”中的鍵或“有序集合(TreeSet)”中的元素,而不需要指定比較器。
Comparable 定義
Comparable 介面僅僅只包括一個函式,它的定義如下:
|
說明:
假設我們通過 x.compareTo(y) 來“比較x和y的大小”。若返回“負數”,意味著“x比y小”;返回“零”,意味著“x等於y”;返回“正數”,意味著“x大於y”。
Comparator 簡介
Comparator 是比較器介面。
我們若需要控制某個類的次序,而該類本身不支援排序(即沒有實現Comparable介面);那麼,我們可以建立一個“該類的比較器”來進行排序。這個“比較器”只需要實現Comparator介面即可。
也就是說,我們可以通過“實現Comparator類來新建一個比較器”,然後通過該比較器對類進行排序。
Comparator 定義
Comparator 介面僅僅只包括兩個個函式,它的定義如下:
|
說明:
(01) 若一個類要實現Comparator介面:它一定要實現compareTo(T o1, T o2) 函式,但可以不實現 equals(Object obj) 函式。
為什麼可以不實現 equals(Object obj) 函式呢? 因為任何類,預設都是已經實現了equals(Object obj)的。 Java中的一切類都是繼承於java.lang.Object,在Object.java中實現了equals(Object obj)函式;所以,其它所有的類也相當於都實現了該函式。
(02) int compare(T o1, T o2) 是“比較o1和o2的大小”。返回“負數”,意味著“o1比o2小”;返回“零”,意味著“o1等於o2”;返回“正數”,意味著“o1大於o2”。
Comparator 和 Comparable 比較
Comparable是排序介面;若一個類實現了Comparable介面,就意味著“該類支援排序”。
而Comparator是比較器;我們若需要控制某個類的次序,可以建立一個“該類的比較器”來進行排序。
我們不難發現:Comparable相當於“內部比較器”,而Comparator相當於“外部比較器”。