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

Mah*_*afy 9 java treemap

我想写这样的代码 -

for (Map.Entry<Long, Integer> e : map.entrySet()){
    map.remove(k);
    map.put(x, value);
}
Run Code Online (Sandbox Code Playgroud)

但我得到了java.util.ConcurrentModificationException 我也尝试使用,Iterator但我也一样Exception

Sub*_*der 10

解释原因造成的 ConcurrentModificationException

map.remove(k);
map.put(x, value);
Run Code Online (Sandbox Code Playgroud)

for-each循环也在内部创建的迭代器entrySetmap.在迭代地图时,您已经通过将值再次放入map(map.put(x,value))来修改地图的结构,这导致了这一点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);
Run Code Online (Sandbox Code Playgroud)