我有一张地图.
Map<UUID, List<UUID>> parentsMap
Run Code Online (Sandbox Code Playgroud)
当我试图清除值时:
parentsMap.values().clear()
Run Code Online (Sandbox Code Playgroud)
它彻底清除了我的地图.我只能这样做:
parentsMap.forEach((k, v) -> v.clear())
Run Code Online (Sandbox Code Playgroud)
我知道当我们编辑地图的.keySet()时,我们会更改原始地图.但是为什么当我们编辑值()时它对键有影响?
这就是Javadoc所说的:
java.util.Map.values()
返回此映射中包含的值的Collection视图.该集合由地图支持,因此对地图的更改将反映在集合中,反之亦然.如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的.该集合支持元素删除,它通过 Iterator.remove,Collection.remove,removeAll,retainAll和clear操作从地图中删除相应的映射.它不支持add或addAll操作.
就像编辑keySet()修改后备一样,编辑也是Map如此values().
由于您希望clear对每个单独的List<UUID>值应用操作Map,因此您必须迭代所有值并分别调用clear()每个值,就像在parentsMap.forEach((k, v) -> v.clear())调用中一样.你也可以parentsMap.values().forEach(List::clear).