我有一张地图。
Map<UUID, List<UUID>> parentsMap
当我尝试清除值时:
parentsMap.values().clear()
完全清除我的地图。我只能这样做:
parentsMap.forEach((k, v) -> v.clear())
我知道当我们编辑地图的.keySet()时,我们会更改原始地图。 但是为什么当我们编辑值()时它会影响键?
答案 0 :(得分:7)
这就是Javadoc所说的:
<强> java.util.Map.values()强>
返回此地图中包含的值的Collection视图。该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。 该集合支持元素删除,它通过 Iterator.remove,Collection.remove,removeAll,retainAll和清除操作从地图中删除相应的映射。它不支持add或addAll操作。
就像修改keySet()
修改后备Map
一样,编辑values()
也是如此。
由于您要对clear
的每个List<UUID>
值应用Map
操作,因此您必须迭代所有值并在每个值上调用clear()
与您在parentsMap.forEach((k, v) -> v.clear())
电话中所做的一样。您也可以parentsMap.values().forEach(List::clear)
。
答案 1 :(得分:2)
你也可以做map.replaceAll((k,v) - &gt; null); :)
但是无论如何你看看值()javadoc
收藏价值()
返回值的Collection视图 包含在这张地图中。该集合由地图支持,因此进行了更改 到地图都反映在集合中,反之亦然。如果是地图 在对集合进行迭代时进行修改 (除了通过迭代器自己的删除操作),结果 迭代是未定义的。 该集合支持删除元素, 从地图中删除相应的映射,通过 Iterator.remove,Collection.remove,removeAll,retainAll和clear 操作。它不支持add或addAll操作。
答案 2 :(得分:1)
您可以使用parentsMap.values().forEach(List::clear)
而不是
parentsMap.forEach((k, v) -> v.clear())
当key-&gt;值已更改
时,始终会修改Hashmap