import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;
public class MyList {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("S1");
al.add("S2");
al.add("S3");
al.add("S4");
Iterator<String> lir = al.iterator();
while (lir.hasNext()) {
System.out.println(lir.next());
}
al.add(2, "inserted");
while (lir.hasNext()) {
System.out.println(lir.next());
}
}
}
Run Code Online (Sandbox Code Playgroud)
特定的代码会引发错误:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at collections.MyList.main(MyList.java:32)
Run Code Online (Sandbox Code Playgroud)
它发生的原因是数组列表在创建后被修改Iterator.
此ArrayList的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出ConcurrentModificationException.因此,在并发修改的情况下,迭代器快速而干净地失败,而不是在未来的未确定时间冒任意,非确定性行为的风险.
Iterator<String> lir = al.iterator(); // Iterator created
while (lir.hasNext())
System.out.println(lir.next());
al.add(2, "inserted"); // List is modified here
while (lir.hasNext())
System.out.println(lir.next());// Again it try to access list
Run Code Online (Sandbox Code Playgroud)
你应该在这里做什么在修改后创建新的迭代器对象.
...
al.add(2, "inserted");
lir = al.iterator();
while (lir.hasNext())
System.out.println(lir.next());
Run Code Online (Sandbox Code Playgroud)
您正在修改 Collection,然后尝试使用相同的迭代器。
再次获取Collection迭代器
al.add(2, "inserted");
Iterator<String> lirNew = al.iterator();
while (lirNew.hasNext()) {
System.out.println(lirNew.next());
}
Run Code Online (Sandbox Code Playgroud)或使用ListIterator
ArrayList<String> al = new ArrayList<String>();
al.add("S1");
al.add("S2");
al.add("S3");
al.add("S4");
ListIterator<String> lir = al.listIterator();
while (lir.hasNext()) {
System.out.println(lir.next());
}
lir.add("insert");
while (lir.hasNext()) {
System.out.println(lir.next());
}
Run Code Online (Sandbox Code Playgroud)