任何人都可以帮我解决这个问题吗?它会抛出一个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());
}
}
答案 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的迭代器是故障安全的。