当特定地图中有多个修改时,以下代码可以正常工作.但是当只有一个修改时,它会抛出并发修改异常
for(Map.Entry<String, List<String>> mapEntry : beanMap.entrySet()) {
for(String dateSet : dateList) {
String mName = mapEntry.getKey();
boolean dateFound = false;
if(beanMap.containsKey(dateSet)) {
dateFound = true;
System.out.println(" Found : "+mapEntry.getKey());
}
if(!dateFound)
{
Map<String, List<String>> modifiedMap = beanMap;
List<String> newBeanList = new ArrayList<String>();
dBean beanData = new Bean(dateSet+"NA","NA","NA",0,0,0);
newBeanList.add(beanData);
System.out.println(" Adding : "+dateSet+" "+"NA");
modifiedMap.put(mName, newBeanList);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,只修改一次"modifiedMap"时抛出ConcurrentModificationException.可能还有更多,但无法找出原因.
当您使用增强型for循环时,Iterator在幕后有一个隐含的工作.您尝试beanMap使用此行制作副本:
Map<String, List<String>> modifiedMap = beanMap;
Run Code Online (Sandbox Code Playgroud)
但是,这只会创建另一个引用同一地图对象的引用变量.仍然只有一个地图,您正在修改它:
modifiedMap.put(mName, newBeanList);
Run Code Online (Sandbox Code Playgroud)
所述Iterator然后检测到当它试图遍历到下一个条目,从而在地图上被修改ConcurrentModificationException.
在迭代原始地图Map时new,您可以创建另一个,并put对该地图进行所有修改.
在完成对原始地图的迭代之后,您可以调用该putAll方法,传递新地图,以应用您想要的所有修改.