我有以下代码,我希望在情况 2 场景中抛出 ConcurrentModificationException
,但它运行成功。据我所知,如果我在 map 中使用单键做同样的事情,它不会抛出异常,因为 here
但当我再次重现这个场景时,有多个键和两个案例 -
- 通过新 key 进行修改。
- 通过现有 key 进行修改。
案例1:
Map<String,String> mp = new HashMap<String,String>();
mp.put("1", "10");
mp.put("2", "11");
mp.put("3", "12");
mp.put("4", "13");
for (String key :mp.keySet()) {
mp.put("5", "14");
}
这将按预期工作,抛出ConcurrentModificationException
。
案例2:
Map<String,String> mp = new HashMap<String,String>();
mp.put("1", "10");
mp.put("2", "11");
mp.put("3", "12");
mp.put("4", "13");
for (String key :mp.keySet()) {
mp.put(key, "14");
}
它不会抛出ConcurrentModificationException
。为什么??
最佳答案
在第一种情况下,您修改映射的结构,以便获得 CME(添加新的键/值对)。在第二种情况下,您不会修改结构(覆盖现有键的值)。所以你不会得到 CME
关于java - 在 Map 中,如果我们使用现有键进行修改,我们不会得到 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30701789/