将整数对象添加到hashSet

3

考虑下面的代码:

6.  Set<Integer> set = new HashSet<Integer>();
7.  Integer i1 = 45;
8.  Integer i2 = 46;
9.  set.add(i1);
10. set.add(i1);
11. set.add(i2); System.out.print(set.size() + " ");
12. set.remove(i1); System.out.print(set.size() + " ");
13. i2 = 47;
14. set.remove(i2); System.out.print(set.size() + " ");
15. System.out.println(set.contains(i2));

代码输出:
``` 2 1 1 false ```
在第14行后,我认为集合大小将会是0,但实际上是1。我猜测在第13行添加了一个新的对象i2到集合中,因此我在第15行进行了测试,但返回值为false(即集合中不存在i2),这是为什么呢?

2
你没有修改集合中的 i2。你修改的是引用 i246 仍然在集合中。 - Louis Wasserman
3个回答

6

在第14行,你实际上并没有从集合中移除任何元素,因为你在前一行重新为i2赋值为一个不在集合中的不同元素。尝试看看如果完全删除第13行会发生什么。

P.S. 集合的remove方法实际上返回一个布尔值,所以你可以使用System.out.println(set.remove(i2))来查看i2是否真的被移除了。


2

1. 集合(Set)维护其中数据的独特性。

因此,将所有数据添加到set中后:

[46, 45]

看一下这个跟踪...

[46,45]

set.remove(i1)

[46]

i2 = 47;
set.remove(i2);

[46] // i2 = 47,但是你没有将其添加到集合中

因此,现在当i2 = 47时,它不在集合中,所以为false。


2
< p > [45,46] -> 移除 45 -> [46] -> 移除 47 -> [46] 因为 47 不在其中。当你使用自动装箱引用来赋值给 i2 时,引用被更改但是哈希集仍然包含旧值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接