如果我爲某個類實現java.lang.Comparable
,還需要覆蓋equals()
方法嗎?或者Comparable
也可以用於equals
?java.lang.Comparable且等於
如果答案是否,那麼如果出現一些差異呢?假設我在equals()
方法中將兩個對象稱爲相等的方式與我在Comparable
的compareTo()
範圍內稱兩個相同類的對象的方式不同。
此外,如果我執行Comparable
,我是否也必須覆蓋equals()
?
如果我爲某個類實現java.lang.Comparable
,還需要覆蓋equals()
方法嗎?或者Comparable
也可以用於equals
?java.lang.Comparable且等於
如果答案是否,那麼如果出現一些差異呢?假設我在equals()
方法中將兩個對象稱爲相等的方式與我在Comparable
的compareTo()
範圍內稱兩個相同類的對象的方式不同。
此外,如果我執行Comparable
,我是否也必須覆蓋equals()
?
雖然建議(和相當合理的),其具有a.compareTo(b) == 0
暗示a.equals(b)
(並且反之亦然),它是不需要。 Comparable
用於在對一系列對象執行排序時使用,而equals()
僅用於測試直線相等。
This link關於正確實施compareTo
有一些很好的信息。
從java.lang.Comparable的Javadoc:
強烈推薦(雖然不是必需的)使自然排序與equals一致。
雖然推薦使用,但.equals()
和.compareTo()
並不要求具有相同的行爲。
試想一下,在BigDecimal的API:http://download.oracle.com/javase/1,5.0/docs/api/java/math/BigDecimal.html#equals(java.lang.Object)
比方說,我稱之爲兩個對象的平等享有平等()的方式 方法是從我稱之爲同一類 的兩個對象的方式不同在Comparable的toCompare()內相等嗎?
如果你這樣做,你把這些對象爲有序set,該集將胡作非爲。 From the docs on SortedSet:
注意,如果 有序set要正確實現Set接口,則有序集(無論是否提供了明確的 比較器)保持的順序必須與equals一致。
例如,TreeSet可能(錯誤地)包含兩個對象,其中即使
a.compareTo(b) != 0
a.equals(b) == true
所有的'TreeSet'操作都使用'compareTo'來執行 - 所以比較返回'!= 0'的對象被認爲是不同的,並且比較返回'== 0'的對象是相同的(因此只有第一個被添加到該集合實際上保留)。正如Javadoc所說的那樣:「即使排序與等號不一致,排序集的行爲也是明確定義的;它只是不服從Set接口的總體合同 –
+1下面是相關的有效Java的章節(見第11項)的鏈接http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf – MByD
@MByD感謝您的鏈接。它(毫不意外)說比我更好! – dlev
@MbyD感謝您的鏈接。打電話可以嗎?compareTo(b)或compare()直接? – aps