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集合中不存在),这是为什么呢?

4

3 回答 3

6

你从来没有真正从第 14 行的集合中删除任何东西,因为你i2在上一行重新分配了一个不在集合中的不同的东西。试着看看当你完全删除第 13 行时会发生什么。

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

于 2012-09-02T13:59:03.220 回答
2

[45,46]-> Remove 45-> [46]-> Remove 47->[46]因为 47 不存在。此外,当您使用自动装箱分配 i2 时,引用已更改,但 hashset 仍包含旧值。

于 2012-09-02T14:05:37.873 回答
2

1. Set 维护其中数据的唯一性。

所以set在添加所有数据之后是

[46, 45]

看到这个痕迹...

[46,45]

set.remove(i1)

[46]

i2 = 47;
set.remove(i2);

[46] // as i2 = 47, but you didn't add it to the set

所以现在因为i2 = 47不在集合中,所以它是错误的。

于 2012-09-02T14:11:02.970 回答