2013-02-13 96 views
0

我正在用Java編寫一個程序,我想使用HashSet(和HashMap)。我無法使contains(和containsKey)方法正常工作。我想我必須在某處重寫某些equals方法才能工作。這個想法是獲得下面的一段代碼來產生輸出:true。有關我如何做到這一點的任何想法?使用HashSet測試遏制

import java.util.HashSet; 
import java.util.Set; 

public class Sets { 

    public static void main(String args[]){ 

     Set<StringBuilder> wordSet = new HashSet<StringBuilder>(); 
     StringBuilder element = new StringBuilder("Element"); 
     wordSet.add(element); 
     StringBuilder element2 = new StringBuilder("Element"); 
     System.out.println(wordSet.contains(element2)); 

    } 

} 

回答

6

不能使用StringBuilder這裏,因爲StringBuilder使用參考平等,而不是內容的平等。改爲使用String

(這是有道理的,因爲StringBuilder是可變的,和兩個StringBuilder S可在同一個點和不平等後來平等的。這不是寫一個hashCode()equals方法的問題,因爲StringBuilder是不是你寫了一個類,它是內置於Java中的。)

+0

感謝您的回答。在我想寫的代碼中,我需要迭代地構建單詞,所以我想在那裏使用StringBuilder,並且需要將當前單詞列表存儲在HashSet中。 – 2013-02-13 19:49:29

+0

一旦你建立了一個'StringBuilder',只需使用它的'toString()'方法將它恢復到'String'。只要你在'HashSet'中只使用'String',你就會好的。 – 2013-02-13 19:51:09

+0

啊,好的。這樣可行。謝謝。 – 2013-02-13 19:54:15

1

StringBuilder不重寫默認的hashCode()和equals()方法,所以它使用Object的實現 - 基本上做了==檢查。由於您不使用完全相同的StringBuilder實例,contains()調用返回false。

因爲類是final的,所以你不能擴展它來添加equals()和hashCode(),所以你需要給你自己的類。

1

請勿使用StringBuilder。使用一個字符串。