2013-03-18 112 views
5

這裏在下面的例子中,我創建了哈希集,其中我添加了三個字符串值 s1,s2,s3,儘管它顯示了我的哈希集1的大小。爲什麼?Hashset大小問題

public static void main(String args[]) 
{ 
    String s1="abc"; 
    String s2=new String("abc"); 
    String s3="abc"; 
    Set setdemo=new HashSet(); 
    setdemo.add(s1); 
    setdemo.add(s2); 
    setdemo.add(s3); 

    System.out.println("s1 hashcode -:"+ System.identityHashCode(s1)); 
    System.out.println("s2 hashcode -:"+ System.identityHashCode(s2)); 
    System.out.println("s3 hashcode -:"+ System.identityHashCode(s3)); 
    System.out.println("Set size is -:"+setdemo.size()); 
} 

輸出:

s1 hashcode -:17523401 
s2 hashcode -:8567361 
s3 hashcode -:17523401 
Set size is -:1 
+1

通過重寫的equals()方法測試字符串相等性。該方法考慮了String的內容。這就是爲什麼當s1!= s2時,s2不在集合中。 s1.equals(s2)返回true。 – Thihara 2013-03-18 10:07:42

回答

4

設置不允許重複。當字符串被放入池中時,它們都指向相同的實例。

+2

它們並不全都指向同一個實例,因爲String s2沒有放入字符串池中。 – ghdalum 2013-03-18 10:07:45

+0

@ghdalum是對的sudhanshu他們不指向相同的情況。 s2是一個新的實例,即使hascode o/p也是如此。 – amod 2013-03-21 08:55:56

0

因爲在HashSet中只保存了唯一條目。這裏的「ABC」加3次,唯一字符串農行將即使你得救添加被確定爲具有相當於散列碼,當爲平等測試返回true它的次數

2

Duplicate

在你的情況下,所有3 Strings被確定爲複製,自Set消除重複,大小爲你的情況1

0

HashSet不存儲多個相等的對象 - 它是一個「集合」。您應該使用MultiSet(也稱爲Bag)實現,例如從Apache Commons Collections或Guava中獲取 - 這些還會存儲您添加的副本數。

0

HashSet.add

將指定的元素e這一套如果集合不包含 元素e2這樣(e==null ? e2==null : e.equals(e2))

所以,在上面添加操作:

s2.equals(s1)回報trues2不會被添加。

s3.equals(s1)返回true,s3也不會被添加到setdemo

0

String中的每一個都將具有由hash()函數返回的類似hashCode。 Set不允許重複,它肯定會覆蓋該位置的前一個值。

0

檢查輸出

s1.equals(s2) 
s2.equals(s3) 

String類的equals方法,它是不是讓你一次又一次地添加相同的對象,因爲HashSet的使用equals方法用於識別對象是否相同與否。

0

每當我們創建一個String類的對象,它會檢查值是否已經存儲在其他字符串中。 像

String s1 = "hello"; 
String s2 = "hello"; 

在這種情況下,也不會分配用於S1和S2兩個存儲單元,但只有一個。當我們檢查使用.equals()操作數時,它會檢查出現的內存位置是否相同。 在:

setdemo.add(s1); 
setdemo.add(s1); 
setdemo.add(s1); 

我們創建三個存儲單元(深入淺出),以及但當HashSet的內部檢查(再簡單計算).equals,它告訴它相同的內存位置,因此HashSet的大小是1.