addAll()奇怪地更新了HashMap

时间:2015-04-12 20:20:38

标签: java dictionary set

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()的东西吗?如果在set1.addAll(set2)之后调用mapp.put("A", set1),则mapp不应包含set2的任何部分吗?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

由于您将set1放入Map并对其进行修改,因此Map中的此更改将是暂时的。这是同一个对象。 add(...)的{​​{1}}不会复制参数。它将此对象恰好插入Map,因此,Map中会暂时看到对原始条目(即set1)所做的更改。

答案 2 :(得分:1)

set1基本上是一个对象,对象是相同的,无论你要添加到set1中的任何东西都会反映在地图中。

 set1.addAll(set2);

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

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

答案 3 :(得分:1)

如果删除

set1.addAll(set2);

然后它只打印一个。

因为

set1.addAll(set2);

将set2的元素添加到set1,然后更新“A”键以包含set1的所有新元素。当你调用mapp.get(“A”)时,它会返回“A”的新内容。