HashMap中的并发修改异常

时间:2013-03-22 11:20:41

标签: java list hashmap

我正在用Java编写这个程序,而且我得到了一个java.util.ConcurrentModificationException。代码摘录如下,如果需要更多代码,请告诉我。

for (String eachChar : charsDict.keySet()) {
    if (charsDict.get(eachChar) < 2) {
        charsDict.remove(eachChar);
    }
}

charsDict定义为

Map<String, Integer> charsDict = new HashMap<String, Integer>();

请帮帮我:)。

3 个答案:

答案 0 :(得分:6)

使用迭代器时,不允许从地图中删除元素。

解决此问题的典型解决方案:

List<String> toBeDeleted = new ArrayList<String>();
for (String eachChar : charsDict.keySet()) {
    if (charsDict.get(eachChar) < 2) {
        toBeDeleted.add(eachChar);
    }
}

for (String eachChar : toBeDeleted) {
    charsDict.remove(eachChar);
}

答案 1 :(得分:5)

您需要使用迭代器的remove方法:

for (Iterator<String> it = charsDict.keySet().iterator(); it.hasNext();) {
    String eachChar = it.next();
    if (charsDict.get(eachChar) < 2) {
        it.remove();
    }
}

另请注意,由于您需要访问密钥和值,因此使用entrySet代替会更有效:

for (Iterator<Map.Entry<String, Integer>> it = charsDict.entrySet().iterator(); it.hasNext();) {
    Map.Entry<String, Integer> e = it.next();
    String eachChar = e.getKey();
    int value = e.getValue();
    if (value < 2) {
        it.remove();
    }
}

最后看来实际上没有使用该键,所以循环变为:

for (Iterator<Integer> it = charsDict.values().iterator(); it.hasNext();) {
    if (it.next() < 2) {
        it.remove();
    }
}

另见this related post

答案 2 :(得分:-2)

使用ConcurrentHashMap可能是一个更好的选择,如果在线程之间传播... Iterator不是线程安全的,你应该创建一个新的迭代器,在线程之间使用相同的。