2010-11-05 144 views
112

可能重複:
difference between compare() and compareTo()
Java: What is the difference between implementing Comparable and Comparator?的Java:可比VS比較

什麼是可比的,比較之間的差異鍵。

在哪些情況下,哪個優於其他?

感謝

更新 - 以實例很好的鏈接!

http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html

+2

http://grdurand.com/static/presentation_four/comparable.html – 2010-11-05 17:52:49

+1

另外一個副本:[何時使用Comparable and Comparator](http://stackoverflow.com/q/2266827/642706)。 – 2015-07-06 02:27:12

+0

優秀的示例鏈接。簡單明瞭。請閱讀。 – Androidster 2016-10-10 19:45:55

回答

158

當你的班級實施Comparable時,該班級的compareTo方法正在定義該對象的「自然」排序。該方法在合同中有義務(儘管不是要求)與該對象上的其他方法一致,例如當.equals()比較返回true時,總是應該返回0。

A Comparator是它自己定義如何比較兩個對象,並可用於比較對象的方式可能不符合自然順序。

例如,字符串通常按字母順序進行比較。因此"a".compareTo("b")將使用字母比較。如果你想比較字符串的長度,你需要編寫一個自定義比較器。

總之,沒有太大的區別。它們都以類似的方式結束。一般來說,自然順序的實現是可比較的(自然順序定義顯然是可以解釋的),併爲其他排序或比較需求編寫一個比較器。

+8

對象應該在對象內部實現。所以有一個用compareTo方法創建的對象的依賴關係,這將隱含在比較對象的特定類型實現中。但是,比較器是外部化的,我們可以爲同一個對象提供多種類型的比較器。還需要更正我的理解。 – Sridhar 2016-04-21 02:52:43

+0

我遇到過的一個案例是,您可能想隨意對任何字段進行條件排序,在這種情況下,您可以動態地傳遞Comparator以對類的集合進行排序,但是如果您只是想在另一個字段上定義唯一性屬性,然後在課堂中實現Comparable。它們不是相互排斥的。 – markg 2017-11-17 14:14:37

106

Comparator爲您提供了對你有沒有控制權類型提供定製的比較邏輯的一種方式。

Comparable允許您指定您正在實施的對象如何進行比較。顯然,如果你不能控制一個類(或者你想提供多種方法來比較你可以控制的對象),那麼就使用Comparator。您可以使用Comparable

+30

**對源**的控制是這裏的關鍵字。 – 2015-07-18 18:21:06

+0

@JonasGröger對於一個班級沒有控制權意味着什麼? – TheLogicGuy 2016-12-22 18:27:56

+0

@TheLogicGuy如果某個類來自依賴項或其他您不能更改的代碼,則您無法控制該類。 – 2016-12-22 18:55:08