哈希集大小问题

时间:2013-03-18 09:54:32

标签: java hashset

这里在下面的例子中我已经创建了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

8 个答案:

答案 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)

HashSet.add

  如果集合包含no,则

将指定的元素e添加到此集合   元素e2使(e==null ? e2==null : e.equals(e2))

所以,在上面的添加操作中:

s2.equals(s1)返回trues2无法添加。

s3.equals(s1)返回trues3也未添加到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.