2015-05-09 63 views
0

我有一個自定義類,覆蓋equals()hashCode()方法。我將該類的實例存儲在TreeSet中。我不知道爲什麼tree.contains(someObject)返回true,而tree.first().equals(someObject)返回false,在tree只有一個元素的情況下。Java包含()不符合equals()

+2

你可以分享對象'equals'和'hashCode'嗎? – Mureinik

+0

我同意@Mureinik。在這個問題被關閉或投票重大之前,發佈所有相關的代碼。 – CKing

+0

您的自定義類是否實現了「Comparable」,或者您是否爲TreeSet指定了一個自定義的「比較器」? – isnot2bad

回答

2

其實你應該實施Comparable但你也應該覆蓋equals兩者都是必需的。

此外,當equals返回true時,您應該確保compareTo方法總是返回0。如果equals將返回false,那麼compareTo也應返回值!= 0。

如果您想改爲使用HashMap,則需要實施hashCode。所以,實施它也可能是一個好主意。

編輯:

對於那些誰不知道有關Comparator:當你要使用不同種類的排序,不時的該接口使用。在這種情況下,您將創建一個充當分揀機的附加類。這個類然後需要實現Comparator接口。所以在這種情況下,你不希望你的班級實施它。

1

按照Doc爲TreeSet

Set接口是按照equals操作定義的,而是一個 TreeSet實例使用其的compareTo 執行所有元件比較(或比較)的方法,因此兩個元件從這個集合的觀點來看,這個方法被認爲是相等的。

如果您在沒有顯式比較器的情況下實例化TreeSet,它期望插入的元素實現Comparable。看來你還沒有那樣做。