addAll() 奇怪地更新 HashMap
addAll() strangely updating 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()
有什么问题吗?如果在 mapp.put("A", set1)
之后调用 set1.addAll(set2)
,难道 mapp
不应该包含 set2
的任何部分吗?
由于您将 set1
放入 Map
并对其进行了修改,此更改在 Map
中将是暂时的。这是同一个对象。 Map
的 add(...)
不复制参数。它将这个对象准确地插入到 Map
中,因此,对原始条目(即 set1
)所做的更改会暂时出现在 Map
.
中
set1 基本上是一个对象,对象是相同的,无论您添加到 set1 中,都会反映在地图中。
set1.addAll(set2);
您在这里将 b 添加到 set1 中,它在您的代码中清晰可见。最初,它只有 "a" 然后你使用 setAll 方法将 b 添加到它,基本上将 set2 的所有值添加到 set1 ..
因此,当您查看 set1 的值时,您得到的是 b 和 a。
当set1
被放入mapp
时,实际上传递了一个引用。该引用指向一个对象。 set1
持有相同的引用。所以实际上 set1
与 mapp.get("A")
的结果在内存中是同一个对象。这解释了为什么 mapp.get("A")
与 set1
具有相同的值。如果您希望 mapp.get("A")
中的 Set
不干扰 set1
中的对象,则必须创建一个全新的对象(set1
的副本)。
如果你删除
set1.addAll(set2);
然后它将只打印一个。
因为
set1.addAll(set2);
将 set2 的元素添加到 set1,然后更新 "A" 键以包含 set1 的所有新元素。当你调用 mapp.get("A") 它 returns "A".
的新内容
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()
有什么问题吗?如果在 mapp.put("A", set1)
之后调用 set1.addAll(set2)
,难道 mapp
不应该包含 set2
的任何部分吗?
由于您将 set1
放入 Map
并对其进行了修改,此更改在 Map
中将是暂时的。这是同一个对象。 Map
的 add(...)
不复制参数。它将这个对象准确地插入到 Map
中,因此,对原始条目(即 set1
)所做的更改会暂时出现在 Map
.
set1 基本上是一个对象,对象是相同的,无论您添加到 set1 中,都会反映在地图中。
set1.addAll(set2);
您在这里将 b 添加到 set1 中,它在您的代码中清晰可见。最初,它只有 "a" 然后你使用 setAll 方法将 b 添加到它,基本上将 set2 的所有值添加到 set1 ..
因此,当您查看 set1 的值时,您得到的是 b 和 a。
当set1
被放入mapp
时,实际上传递了一个引用。该引用指向一个对象。 set1
持有相同的引用。所以实际上 set1
与 mapp.get("A")
的结果在内存中是同一个对象。这解释了为什么 mapp.get("A")
与 set1
具有相同的值。如果您希望 mapp.get("A")
中的 Set
不干扰 set1
中的对象,则必须创建一个全新的对象(set1
的副本)。
如果你删除
set1.addAll(set2);
然后它将只打印一个。
因为
set1.addAll(set2);
将 set2 的元素添加到 set1,然后更新 "A" 键以包含 set1 的所有新元素。当你调用 mapp.get("A") 它 returns "A".
的新内容