2012-10-12 44 views
3

如果我拿一個例如HashSet<E>,並添加對象,它如何檢查對象是否已經在那裏?套中的唯一性

我有以下簡單的設置:

private class MyObject { 
    String text; 

    public MyObject(String text) { 
     this.text = text; 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (o != null && o instanceof MyObject) { 
      return ((MyObject) o).text.equals(text); 
     } 

     return false; 
    } 

} 

在項目中,我有很多這樣的對象,但都分別初始化。我想篩選雙打,通過將所有的Set,像這樣:

MyObject m1 = new MyObject("1"); 
MyObject m2 = new MyObject("1"); 
MyObject m3 = new MyObject("2"); 

System.out.println(m1.equals(m2)); //expected: true, result: true 
System.out.println(m1.equals(m3)); //expected: false, result: false 

Set<MyObject> myObjects = new HashSet<MyObject>(); 
myObjects.add(m1); 
myObjects.add(m2); 
myObjects.add(m3); 

System.out.println(myObjects.size()); //expected: 2, result: 3 

Set<String> stringList = new HashSet<String>(); 
stringList.add("1"); 
stringList.add("1"); 
stringList.add("2"); 
System.out.println(stringList.size()); //expected: 2, result: 2 

我怎樣才能讓這個我myObjects集不包含這些雙打?所以m1m2是不同的實例,但具有相同的內容,所以我只需要m1

編輯
基於馬蒂亞斯施瓦茨的答案,我已經實現了hashCode()功能如下:

@Override 
     public int hashCode() { 
      return text.hashCode(); 
     } 

但我將如何,如果我有多個字段一個更復雜的類實現此方法?

+1

對於兩個對象o1,o2,如果o1.equals(o2),那麼他們必須返回相同的hashCode,而你的類MyObject不能確保它。你必須在你的類中實現方法hashCode – gefei

回答

7

HashSet確定在對象上調用equalshashCode的結果中兩個對象是否相同。如果您實施equals,則必須實施hashCode。如果它們不一致,HashSet將不會正確行爲... 因此,重要的是如何在MyObject(這btw真的是一個類...)上實現這兩種方法。

+0

啊,這是有道理的,它的工作原理。我已經實現了'hashCode()'函數來返回'text.hashCode()'。但是如果我在'MyObject'類中有多個字段,我將如何實現這個方法? – nhaarman

+0

@Niek你必須實現它才能符合散列碼合約;請參閱DVK在[這個問題]上的答案(http://stackoverflow.com/questions/2707541/why-should-i-override-hashcode-when-i-override-equals-method?rq=1)。 – Jesper

+0

如果'o1.equals(o2)'那麼'o1.hashCode()== o2.hashCode()'必須是這種情況(但不一定是相反的... –

0

以下添加到您的類MyObject的

public String hashCode() { 
    return text.hashCode(); 
} 

(我想,文本不爲空,如果它可以爲空,你必須考慮這acccoutn和作廢NPE)

2

如果你使用eclipse然後右鍵 - >源代碼 - >生成的hashCode和equals。如果你有什麼瞭解更多有關哈希碼和equals從Effective Java讀取this portion

+0

太棒了!謝謝! – nhaarman