以下代碼在特定映射中存在多個修改時正常工作。但只有一個修改時,它會引發併發修改異常爲什麼拋出併發修改異常
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);
}
}
}
在修改「modifiedMap」當僅一次它拋出ConcurrentModificationException的上面的代碼。可能還有更多,但無法找出原因。
或者像這樣在迭代中使用Iterator Iterator >> iterator = beanMap.entrySet()。iterator(); iterator.hasNext(); 哪個更好? –
2015-02-09 17:39:45
另一種選擇是在開始迭代器時創建原始副本,例如對於(Map.Entry> mapEntry:new ArrayList(beanMap.entrySet())) –
Ken
2015-02-09 17:40:23
@ user1629109即使您使用顯式的'Iterator',它在修改地圖時仍可能拋出'ConcurrentModificationException'。這裏的關鍵是避免修改地圖,因爲你用'Iterator'迭代它。 – rgettman 2015-02-09 17:42:37