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拥有相同的引用。因此,实际上set1mapp.get("A")的结果在内存中是同一对象。这就解释了为什么mapp.get("A")set1具有相同的值。如果希望Set中的mapp.get("A")不干扰set1中的对象,则必须创建一个全新的对象(set1的副本)。

关于java - addAll()奇怪地更新了HashMap,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29594206/

10-10 11:19