解释原因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);


