Comparable與Comparator的區別

摸魚2023發表於2018-05-08

Comparable與Comparator的區別

Comparable和Comparator都是用來實現集合中元素的比較、排序的。
Comparable是在集合內部定義的方法實現的排序,位於java.util下。
Comparator是在集合外部實現的排序,位於java.lang下。

Comparable是一個物件本身就已經支援自比較所需要實現的介面,如String、Integer自己就實現了Comparable介面,可完成比較大小操作。自定義類要在加入list容器中後能夠排序,也可以實現Comparable介面,在用Collections類的sort方法排序時若不指定Comparator,那就以自然順序排序。所謂自然順序就是實現Comparable介面設定的排序方式。


Comparator是一個專用的比較器,當這個物件不支援自比較或者自比較函式不能滿足要求時,可寫一個比較器來完成兩個物件之間大小的比較。Comparator體現了一種策略模式(strategy design pattern),就是不改變物件自身,而用一個策略物件(strategy object)來改變它的行為。

總而言之Comparable是自已完成比較,Comparator是外部程式實現比較。


分析二:

接下來描述下二者的不同:

1、Comparator在集合(即你要實現比較的類)外進行定義的實現,而Comparable介面則是在你要比較的類內進行方法的實現。這樣看來Comparator更像是一個專用的比較器。

2、Comparator實現了演算法和資料的分離,從程式碼也可以看出,其實這和第一點是相輔相成的,因為Comparable依賴於某一個需要比較的類來實現。

3、Comparable支援自比較,自比較是指比如String等類裡面本身就有CompareTo()方法,直接就可以進行String類物件的比較,這也可以從較之Comparator,Comparable中Arrays.sort()方法中只帶陣列引數的形式與書上例子更相似這點看出。

4、從第3點延伸,我們可以看到當不滿足於自比較函式,如String類時,我們試圖改寫規則要怎麼辦——通過Comparator因為它支援外比較,它是分離的。

5、當一個又一個類設計完成後,或許我們最初沒有設想到類的比較問題,而沒使用Comparable介面,那我們之後可以通過Comparator來完成,而同時無需改變之前完成的類的構建。

6、運用Arrays.sort()方法時,注意二者的引數不同,Comparator多了一個引數,這第二個引數是使用Comparator介面的那個被視為專用比較器的類的物件。


相關文章