问题描述
解释原因ConcurrentModificationException
map.remove(k);
map.put(x, value);
for-
each循环也在内部创建的迭代器entrySet
的map
。在遍历map时,您已经通过将值再次放入map(map.put(x,value)
)来修改了map的结构,这会导致这种情况ConcurrentModificationException
。
甚至在文档中也对此做了很好的解释-
此类的所有“集合视图方法”返回的迭代器都是快速失败的:如果在创建迭代器后的任何时间对结构进行结构修改,则除了通过迭代器自己的remove方法之外,该迭代器都将抛出ConcurrentModificationException 。因此,面对并发修改,迭代器将快速而干净地失败,而不是冒着在未来不确定的时间冒任意,不确定的行为的风险。
如何解决 -
您必须在迭代时更改此映射的结构更改,以后可以插入此值,例如保留临时映射,并在迭代完成后将其添加到主映射中。
Map<Long, Integer> tempMap = new HashMap<>();
for (Map.Entry<Long, Integer> e : map.entrySet()){
map.remove(k);
tempMap.put(x, value);
}
map.putAll(tempMap);
解决方法
我想写这样的代码-
for (Map.Entry<Long,Integer> e : map.entrySet()){
map.remove(k);
map.put(x,value);
}
但是我也java.util.ConcurrentModificationException
尝试使用,Iterator
但是我得到了相同的结果Exception