addAll() 奇怪地更新 HashMap

addAll() strangely updating HashMap

Map<String, HashSet<String>> mapp = new HashMap<String, HashSet<String>>();

HashSet<String> set1 = new HashSet<String>();
set1.add("a");

HashSet<String> set2 = new HashSet<String>();
set2.add("b");

mapp.put("A", set1);

set1.addAll(set2);

System.out.println(mapp.get("A"));

输出:

[b, a]

输出不应该只是 [a] 吗? addAll() 有什么问题吗?如果在 mapp.put("A", set1) 之后调用 set1.addAll(set2),难道 mapp 不应该包含 set2 的任何部分吗?

由于您将 set1 放入 Map 并对其进行了修改,此更改在 Map 中将是暂时的。这是同一个对象。 Mapadd(...) 不复制参数。它将这个对象准确地插入到 Map 中,因此,对原始条目(即 set1)所做的更改会暂时出现在 Map.

set1 基本上是一个对象,对象是相同的,无论您添加到 set1 中,都会反映在地图中。

 set1.addAll(set2);

您在这里将 b 添加到 set1 中,它在您的代码中清晰可见。最初,它只有 "a" 然后你使用 setAll 方法将 b 添加到它,基本上将 set2 的所有值添加到 set1 ..

因此,当您查看 set1 的值时,您得到的是 b 和 a。

set1被放入mapp时,实际上传递了一个引用。该引用指向一个对象。 set1 持有相同的引用。所以实际上 set1mapp.get("A") 的结果在内存中是同一个对象。这解释了为什么 mapp.get("A")set1 具有相同的值。如果您希望 mapp.get("A") 中的 Set 不干扰 set1 中的对象,则必须创建一个全新的对象(set1 的副本)。

如果你删除

set1.addAll(set2);

然后它将只打印一个。

因为

set1.addAll(set2);

将 set2 的元素添加到 set1,然后更新 "A" 键以包含 set1 的所有新元素。当你调用 mapp.get("A") 它 returns "A".

的新内容