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
具有相同的值。如果希望Set
中的mapp.get("A")
不干扰set1
中的对象,则必须创建一个全新的对象(set1
的副本)。
关于java - addAll()奇怪地更新了HashMap,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29594206/