【发布时间】:2012-08-09 22:26:16
【问题描述】:
假设一个映射包含整数键和一个字符串列表作为它的值。然后,我不能这样做:
for (Map.Entry<Integer, List<String>> entry : map.entrySet()){
for (String string : entry.getValue()){
if (string.startsWith("a")){
entry.getValue().remove(string);
}
}
}
它抛出ConcurrentModificationException。但如果我执行以下操作:
for (Map.Entry<Integer, List<String>> entry : map.entrySet()){
entry.setValue(new ArrayList<String>());
}
这非常有效。我们现在不是在修改底层地图吗?
【问题讨论】:
-
我们正在更改值而不是添加或删除任何新条目,因此键集保持不变。
-
顺便说一句,如果您使用
Iterator.remove(),第一个示例不会抛出 CME -
如果我更改值 Object 的任何属性。例如,如果值是 List
并且我在迭代时更改了雇员对象的名称,为什么在这种情况下它会引发并发修改,因为我们没有更改这种情况下的键
标签: java concurrency map loops