中的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")); 

输出:中的addAll()奇怪的更新HashMap的

[b, a] 

不应该输出只是[a]?这是否与addAll()?如果set1.addAll(set2)被调用后mapp.put("A", set1),不应该mapp不包括set2的任何部分?

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

由于您将set1放入您的Map并对其进行修改,因此此更改在Map中将为瞬态。它是同一个对象。 Mapadd(...)不会复制该参数。它将这个对象正好插入到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”的新内容。