2013-03-18 101 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.