2014-01-10 63 views

回答

1

Comparable

的自然順序一類C被認爲是與等號當且僅當e1.compareTo(e2) == 0對每一個e1C類的e2相同的布爾值e1.equals(e2)一致。請注意,null不是任何類的實例,並且e.compareTo(null)應拋出NullPointerException,即使e.equals(null)返回false

強烈建議(儘管不要求)自然排序與等於一致。這是因爲排序集合(和排序映射)沒有顯式比較器時,它們與自然排序與equals不一致的元素(或鍵)一起使用時表現得「奇怪」。特別是,這樣的有序集合(或有序映射)違反了集合(或映射)的一般契約,它是用等價方法定義的。

(重點煤礦)

所以,你不需要覆蓋equals()(即它不會在標準排序方法中引起問題,因爲它們只用compareTo(),也不會違反合同Comparable),但它肯定不會受到傷害。

+0

當我有排序對象的集合,通過使用不同的比較。在這種情況下不止一種方法e1.compareTo(E2)== 0將不一樣e1.equals(E2)。 ..在這種情況下,如果我使用類對象作爲集合的鍵會導致任何問題? –

+0

@paulb你在使用什麼類型的集合? – arshajii

+0

我使用ArraList .. –

2

從的Javadoc Comparator

它通常是這種情況,但並不嚴格要求(比較(X,Y)== 0)==(x.equals(Y))。一般而言,任何違反此條件的比較器都應明確指出這一事實。推薦的語言是「注意:這個比較器強加與等號不一致的排序」。

這意味着您通常不需要覆蓋equals()。除非您希望Comparator返回trueequals相比較的兩個值的非零比較,否則您可能不應該這樣做。

如果您認爲比較的存在需要您改變兩個事物平等的含義的定義,那麼您可能已經設計了很糟糕的東西。

相關問題