HashMap中的并发修改异常

pra*_*ala 2 java list hashmap

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

for (String eachChar : charsDict.keySet()) {
    if (charsDict.get(eachChar) < 2) {
        charsDict.remove(eachChar);
    }
}
Run Code Online (Sandbox Code Playgroud)

charsDict 被定义为

Map<String, Integer> charsDict = new HashMap<String, Integer>();
Run Code Online (Sandbox Code Playgroud)

请帮我 :)

Vin*_*ele 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);
}
Run Code Online (Sandbox Code Playgroud)

  • @assylias是真的,但通常没关系.但是,我更喜欢你的答案. (2认同)

ass*_*ias 5

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

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

还要注意的是,因为你需要访问键和值,这将是更有效地使用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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

另见这篇相关文章.