这里在下面的例子中我已经创建了hashset,我在其中添加了三个字符串值 s1,s2,s3虽然它显示了我的hashset 1的大小。为什么?
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
答案 0 :(得分:5)
设置不允许重复。当字符串放入池中时,它们都指向同一个实例。
答案 1 :(得分:2)
Duplicate
被识别为具有等效哈希码,并在测试相等时返回true
。
在您的情况下,所有3个Strings
都被标识为重复,并且由于Set
消除了重复项,因此大小为1
。
答案 2 :(得分:0)
因为在HashSet中只保存唯一条目。这里“abc”被添加3次,因此即使你添加次数,也只保存String abc
答案 3 :(得分:0)
HashSet不存储多个相等对象 - 它是“set”。您应该使用MultiSet(也称为Bag)实现,例如来自Apache Commons Collections或Guava - 这些存储也是您添加的副本数量。
答案 4 :(得分:0)
如果集合包含no,则将指定的元素
e
添加到此集合 元素e2
使(e==null ? e2==null : e.equals(e2))
所以,在上面的添加操作中:
s2.equals(s1)
返回true
,s2
无法添加。
s3.equals(s1)
返回true
,s3
也未添加到setdemo
。
答案 5 :(得分:0)
每个String都将具有hash()函数返回的类似hashCode。并且Set不允许重复,它肯定会覆盖该位置的先前值。
答案 6 :(得分:0)
检查输出
s1.equals(s2)
s2.equals(s3)
它的String
类equals方法不允许你一次又一次地添加同一个对象,因为HashSet使用equals方法来识别对象是否相同。
答案 7 :(得分:0)
每当我们创建String类的对象时,它会检查值是否已经存储在其他字符串中。 像
String s1 = "hello";
String s2 = "hello";
在这种情况下,它不会为s1和s2分配两个内存位置,而只分配一个内存位置。当我们使用.equals()操作数进行检查时,它会检查出来的内存位置是否相同。 在:
setdemo.add(s1);
setdemo.add(s1);
setdemo.add(s1);
我们正在创建三个内存位置(简单来说),但是当HashSet在内部检查(再次简单地说).equals时,它会告诉它相同的内存位置,因此HashSet的大小为1.