2011-08-07 51 views
23

如果我爲某個類實現java.lang.Comparable,還需要覆蓋equals()方法嗎?或者Comparable也可以用於equalsjava.lang.Comparable且等於

如果答案是,那麼如果出現一些差異呢?假設我在equals()方法中將兩個對象稱爲相等的方式與我在ComparablecompareTo()範圍內稱兩個相同類的對象的方式不同。

此外,如果我執行Comparable,我是否也必須覆蓋equals()

回答

26

雖然建議(和相當合理的),其具有a.compareTo(b) == 0暗示a.equals(b)(並且反之亦然),它是不需要Comparable用於在對一系列對象執行排序時使用,而equals()僅用於測試直線相等。

This link關於正確實施compareTo有一些很好的信息。

+0

+1下面是相關的有效Java的章節(見第11項)的鏈接http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf – MByD

+0

@MByD感謝您的鏈接。它(毫不意外)說比我更好! – dlev

+0

@MbyD感謝您的鏈接。打電話可以嗎?compareTo(b)或compare()直接? – aps

7

java.lang.Comparable的Javadoc:

強烈推薦(雖然不是必需的)使自然排序與equals一致。

0

比方說,我稱之爲兩個對象的平等享有平等()的方式 方法是從我稱之爲同一類 的兩個對象的方式不同在Comparable的toCompare()內相等嗎?

如果你這樣做,你把這些對象爲有序set,該集將胡作非爲。 From the docs on SortedSet

注意,如果 有序set要正確實現Set接口,則有序集(無論是否提供了明確的 比較器)保持的順序必須與equals一致。

例如,TreeSet可能(錯誤地)包含兩個對象,其中即使

a.compareTo(b) != 0 

a.equals(b) == true 
+1

所有的'TreeSet'操作都使用'compareTo'來執行 - 所以比較返回'!= 0'的對象被認爲是不同的,並且比較返回'== 0'的對象是相同的(因此只有第一個被添加到該集合實際上保留)。正如Javadoc所說的那樣:「即使排序與等號不一致,排序集的行爲也是明確定義的;它只是不服從Set接口的總體合同 –

相關問題