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
的任何部分吗?
答案 0 :(得分:2)
将set1
放入mapp
时,实际上会传递参考。该参考指向一个对象。 set1
持有相同的参考。所以实际上set1
与mapp.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”的新内容。