2017-07-27 34 views
-2
  for(Context context : contexts) { 

       if(context.equals(c)){ 
        System.out.println(context.equals(c)+" : "+contexts.contains(c)); 
       } 
      } 

上下文是一個標準的Java TreeSet的equals()和包含()看似矛盾

對我來說,似乎如果這樣會產生任何輸出,它應該產生「真實:真實的」。奇怪的是,它總是以「真:假」的形式出現。

查看文檔;我本質上是複製.contains函數所做的,但得到不同的結果。

任何人都可以解釋這一點嗎?

編輯:從Java文檔(系列):

返回true,如果這個集合包含指定的元素。更正式地說,當且僅當此集合包含至少一個元素e(例如(o == null?e == null:o.equals(e))時才返回true。

+0

請提供'Context'源代碼,如果它是自定義的,或者提供完全限定名稱(包括程序包,如果它是公共訪問的)。 –

+0

@SergeyProkofiev它既不是。不知道爲什麼它應該很重要,因爲它是有問題的TreeSet的實現。 –

+1

不,有什麼問題是你的'equals()'的實現和'compareTo()'的實現。 –

回答

2

看起來hashcode的實現不會與equals混淆。

contains方法將找到對象應該正在使用hashcode。然後它會檢查它是否那裏使用equals

因此,我要建議,如果你正在true:false那麼你需要修復您hashcode實施,使

如果equals回報true兩個對象,然後在兩個對象hashcode返回相同

對於TreeSet對象應該所在的位置使用compareTo所以在那裏等效。

+3

? – RealSkeptic

+0

感謝您的提醒。 – OldCurmudgeon

+0

哈希碼實際上很好。使用HashSet而不是TreeSet我得到'正常'的結果。 –