我理解当我们尝试在列表上执行(添加/删除)同时迭代列表时,数组列表会产生并发修改异常。
例如,当我尝试删除项目时,以下方法应该抛出并发修改异常。
public static void testMe() {
inputList = new ArrayList<String>();
inputList.add("1");
inputList.add("2");
inputList.add("3");
// Try comment the above insertion and uncomment this and run
// for (int i = 0; i < 5; i++) {
// inputList.add(""+i);
// }
System.out.println("List Size:" + inputList.size());
Iterator<String> iterator = inputList.iterator();
while (iterator.hasNext()) {
String value = (String) iterator.next();
if (value.equals("2")) {
inputList.remove(value);
System.out.println("remvoing 2");
}
}
System.out.println("List Size:" + inputList.size());
}
奇怪的是,我没有得到一个。
但是如果我使用for循环插入项目,则抛出异常。我想知道为什么这不会更早发生?
答案 0 :(得分:0)
当我写下我原来接受的答案时,我误解了这个问题,但由于它已被接受而无法删除,因此我将对此进行编辑以总结另一个接受的答案:https://stackoverflow.com/a/29723542/1630906
作为一般规则,在检测到修改时抛出ConcurrentModificationExceptions,而不是引起修改。
因此,当对next()的调用检测到已经进行了修改时抛出了ConcurrentModificationExceptions,这种情况可以避免这种异常。
就像提问者自己在评论中指出的那样:
如果列表有4个元素,如果你试图在第二次迭代中删除一个元素,那么你将得到并发修改。