为什么我们在Java中清除它时得到一个空映射?

时间:2018-05-04 07:16:56

标签: java hashmap

我有一张地图。

Map<UUID, List<UUID>> parentsMap

当我尝试清除值时:

parentsMap.values().clear()

完全清除我的地图。我只能这样做:

parentsMap.forEach((k, v) -> v.clear())

我知道当我们编辑地图的.keySet()时,我们会更改原始地图。 但是为什么当我们编辑值()时它会影响键?

3 个答案:

答案 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