我有以下代码:
public List<String> processMap(Map<String, String> aMap) {
Cloner cloner = new Cloner();
Map<String, String> tempMap = cloner.deepClone(aMap);
while(!tempMap.isEmpty()) {
Iterator<Entry<String, String>> iterator = tempMap.entrySet().iterator();
while(iterator.hasNext()) {
Entry<String, String> entry = iterator.next(); // !!!
}
}
return null;
}
要深度复制地图,我使用此库:Cloner
我标记了我不幸得到ava.util.ConcurrentModificationException
并带有'!!!'
你能告诉我为什么我得到这个例外吗?
完整的代码:
Cloner cloner = new Cloner();
Map<String, FreebaseType> tempFreebaseTypes = new HashMap<String, FreebaseType>();
Map<String, FreebaseType> freebaseTypesCopy = cloner.deepClone(freebaseTypes);
while(!freebaseTypesCopy.isEmpty()) {
Iterator<Entry<String, FreebaseType>> iterator = freebaseTypesCopy.entrySet().iterator();
while(iterator.hasNext()) {
Entry<String, FreebaseType> entry = iterator.next();
if(tempFreebaseTypes.containsKey(entry.getValue().getSuperType()) || entry.getValue().getSuperType() == null) {
tempFreebaseTypes.put(entry.getValue().getType(), entry.getValue());
freebaseTypesCopy.remove(entry.getKey());
}
}
}
List<FreebaseType> sortedFreebaseTypes = new ArrayList<FreebaseType>();
Iterator<Entry<String, FreebaseType>> iterator = tempFreebaseTypes.entrySet().iterator();
while(iterator.hasNext()) {
Entry<String, FreebaseType> entry = iterator.next();
sortedFreebaseTypes.add(entry.getValue());
}
return sortedFreebaseTypes;
答案 0 :(得分:1)
使用迭代器迭代地图时,不允许直接修改地图,或者获得ConcurrentModificationException
。修改映射的唯一方法是间接通过迭代器remove()方法,该方法删除迭代器当前从映射中指向的条目。
替换
行freebaseTypesCopy.remove(entry.getKey());
与
iterator.remove();
并且代码应该可以工作。