即使没有迭代,java中的ConcurrentModificationException也是如此

时间:2016-09-11 03:40:33

标签: java

任何人都可以帮我解决这个问题吗?它会抛出一个ConcurrentModificationException。我知道在迭代集合并同时添加或删除元素时,我们得到ConcurrentModificationException。但我首先不是在迭代。

import java.util.*;
class Test {
public static void main(String[] args){
ArrayList<String> arr = new ArrayList<String>();
ListIterator<String> itr = arr.listIterator();
arr.add("Hello");
arr.add("hi");
System.out.println(itr.next());
}
}

2 个答案:

答案 0 :(得分:1)

当您致电itr.next()时,您正在重复列表(只是不完全)。 Java中的foreach循环实际上只是语法糖:

Iterator<T> it = list.iterator();
while (it.hasNext()) {
    T curr = it.next();
}

修改集合时,无论您是否使用过它们,所有现有的迭代器都会失效。修改列表后必须获取新的迭代器。

答案 1 :(得分:1)

ArrayList的迭代器是failfast意味着如果您尝试迭代并同时添加/删除元素,Iterator或ListIterator将抛出ConcurrentModificationException。

itr.next() // this is iterating(going over the ArrayList)

arr.add("Hello");//This statement is adding to the ArrayList during iteration
arr.add("hi");//Again this statement is adding to ArrayList during iteration

这会导致ConcurrentModificationException。

如果要迭代以及修改(添加/删除)集合,请使用CopyOnWriteArrayList,ConcurrentHashMap。 CopyOnWriteArrayList,ConcurrentHashMap的迭代器是故障安全的。