5

在下面的示例中,我创建了哈希集,其中我添加了三个字符串值 s1、s2、s3,尽管它显示了哈希集 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
4

8 回答 8

5

Set 不允许重复。当字符串被放入池中时,它们都指向同一个实例。

于 2013-03-18T09:56:12.683 回答
2

Duplicate被标识为具有等效的哈希码,并true在测试相等时返回。

在您的情况下,所有 3 个Strings都被标识为重复项,并且由于Set消除了重复项,因此大小适合1您的情况。

于 2013-03-18T09:58:55.790 回答
0

检查输出

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

它的String类 equals 方法不允许您一次又一次地添加相同的对象,因为 HashSet 使用 equals 方法来识别对象是否相同。

于 2013-03-21T09:03:31.600 回答
0

因为在 HashSet 中只保存唯一的条目。这里“abc”被添加了 3 次,所以即使你添加了 String abc 也只会保存它的次数

于 2013-03-18T09:57:38.343 回答
0

HashSet 不存储多个相等对象 - 它是一个“集合”。您应该使用 MultiSet(也称为 Bag)实现,例如来自 Apache Commons Collections 或来自 Guava - 这些还存储您添加的副本数。

于 2013-03-18T09:59:10.887 回答
0

每当我们创建 String 类的对象时,它都会检查值是否已存储在其他字符串中。喜欢

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

在这种情况下,它不会为 s1 和 s2 分配两个内存位置,而只会分配一个。当我们使用 .equals() 操作数检查时,它会检查内存位置是否相同。在 :

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

我们正在创建三个内存位置(简单来说),但是当 HashSet 内部检查(再次简单来说).equals 时,它告诉它相同的内存位置,因此 HashSet 的大小为 1。

于 2013-04-30T09:31:11.907 回答
0

HashSet.add

如果集合不包含任何元素,则将指定元素添加e到此集合e2(e==null ? e2==null : e.equals(e2))

因此,在上述添加操作期间:

s2.equals(s1)返回trues2不会被添加。

s3.equals(s1)return trues3也不会添加到 thesetdemo中。

于 2013-03-18T10:00:09.097 回答
0

每个字符串都将具有由 hash() 函数返回的类似 hashCode。并且 Set 不允许重复,它肯定会覆盖该位置的先前值。

于 2013-03-18T10:39:03.007 回答