HashMap java.util.ConcurrentModificationException

时间:2014-04-23 15:14:55

标签: java

我有以下代码:

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;

1 个答案:

答案 0 :(得分:1)

使用迭代器迭代地图时,不允许直接修改地图,或者获得ConcurrentModificationException。修改映射的唯一方法是间接通过迭代器remove()方法,该方法删除迭代器当前从映射中指向的条目。

替换

freebaseTypesCopy.remove(entry.getKey());

iterator.remove();

并且代码应该可以工作。