为什么会抛出并发修改异常

Dam*_*men 0 java

当特定地图中有多个修改时,以下代码可以正常工作.但是当只有一个修改时,它会抛出并发修改异常

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.可能还有更多,但无法找出原因.

rge*_*man 6

当您使用增强型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.

在迭代原始地图Mapnew,您可以创建另一个,并put对该地图进行所有修改.

在完成对原始地图的迭代之后,您可以调用putAll方法,传递新地图,以应用您想要的所有修改.