2012-02-23 81 views
0

我遇到問題,使用.contains檢查字符串是否存儲在HashSet中。HashSet <String> .contains()

import java.util.HashSet; 

public class Controller 
{ 
    private Queue<String> queue; 
    private HashSet<String> blocked; 

    public Controller() 
    { 
     queue = new Queue<String>(); 
     blocked = new HashSet<String>(); 
    } 

    public void add(String item) 
    {   
     if (!(blocked.contains(item))) queue.add(item); 
    } 
} 

我查了一下,明白我需要重寫.equals方法。這是否意味着我必須創建一個擴展HashSet的新類,然後聲明該新類的實例來代替'HashSet blocked''?

我知道只是使用==來比較兩個字符串不起作用的原因,但我很困惑,因爲下面的代碼似乎在某些情況下工作,但不是全部。

任何意見將不勝感激!

問候

+3

該代碼應該工作; 'String'不重寫'equals()'和'hashCode()'。 – SLaks 2012-02-23 04:25:55

+1

什麼情況下不起作用?記住大小寫敏感。 – NightWolf 2012-02-23 04:27:02

+1

我擔心你誤會了。如果你在'HashSet'中使用一個對象,該對象應該有'hashCode'和'equals'方法,而不是'HashSet'本身。由於'String'帶有它自己的'equals'和'hashCode'方法,所以你不應該做額外的工作。你期望代碼做什麼,爲什麼「不起作用」? – Jeffrey 2012-02-23 04:27:40

回答

2

你並不需要重寫equals方法 - 在String已經有一個很好的對hashCode/equals是在CPU週期計算和分發不同的字符串不同的散列桶的條款有效。

甲雙hashCode/equals方法需要放置在散列集,以便使該容器的正確工作項:hashCode決定上,其中所述對象被放置在散列「桶」,和equals之間非解決衝突 - 具有相同散列碼的相等對象。

維基百科在哈希表上有一個說明article。通讀它以提高您對hashCode/equals概念的理解,它們是使用任何語言(包括Java)使用未排序的關聯容器的基礎。

+0

感謝您的快速響應。我說它不起作用,因爲'塊'HashSet中的字符串仍然被添加到隊列中。我試過打印到控制檯進行檢查,並且確實發生了。這與案件無關。 當打印到控制檯的字符串中包含字符時,是否可以看到字符? – stasis 2012-02-23 04:34:47

+0

@stasis當打印到控制檯時,考慮在您的單詞旁邊添加「警戒字符」 - 比如單引號或方括號。這樣你就可以判斷一個單詞是否有尾隨空格,而另一個單詞是否有空格。我假設你的代碼不是多線程的,對吧? – dasblinkenlight 2012-02-23 04:38:44

+0

感謝您的鏈接。我得出結論,我需要通過瀏覽來覆蓋equals方法,並認爲這將是一個類似的問題。事實上,我不應該重寫.equals使.contains工作,爲什麼你認爲這將是.contains在這種情況下不適合我?再次感謝您的幫助 – stasis 2012-02-23 04:42:21

相關問題