如何在迭代时删除和添加元素到TreeMap?

问题描述

解释原因ConcurrentModificationException

map.remove(k);
map.put(x, value);

for- each循环也在内部创建的迭代器entrySetmap。在遍历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