中的addAll()奇怪的更新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()
?如果set1.addAll(set2)
被调用后mapp.put("A", set1)
,不应该mapp
不包括set2
的任何部分?
答
当set1
被放入mapp
时,实际上通过了一个参考。该参考指向一个对象。 set1
保持相同的参考文献。所以实际上set1
与mapp.get("A")
的结果是相同的内存对象。这解释了为什么mapp.get("A")
与set1
保持相同的值。如果您希望mapp.get("A")
中的Set
不干涉set1
中的Set
,则必须创建一个全新的对象(副本set1
)。
答
由于您将set1
放入您的Map
并对其进行修改,因此此更改在Map
中将为瞬态。它是同一个对象。 Map
的add(...)
不会复制该参数。它将这个对象正好插入到Map
中,因此,在Map
中暂时看到对原始条目进行的更改(即set1
)。
答
set1基本上是一个对象,对象是一样的,无论你添加到set1中的哪一个都会反映在地图上。
set1.addAll(set2);
您在此处添加了b到set1,它在您的代码中清晰可见。最初,它只是“一个”,然后你使用setAll方法将b添加到setAll方法,基本上将set2的所有值添加到set1 ..
因此,当您在查看set1的值时, b和a。
答
如果删除
set1.addAll(set2);
然后它会打印只是一个。
因为
set1.addAll(set2);
增加设置2到设置1的元素,那么“A”键更新为包含SET1的所有新元素。当你调用mapp.get(“A”)时,它返回“A”的新内容。