我想写这样的代码 -
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循环也在内部创建的迭代器entrySet的map.在迭代地图时,您已经通过将值再次放入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)
| 归档时间: |
|
| 查看次数: |
26092 次 |
| 最近记录: |