LAK*_*AIR 2 java collections arraylist
我正在学习 Java 中的集合类。我创建了一个 ArrayList 并向其中添加了一些值。
package LearningJava;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Scanner;
public class Java{
public static void main(String args[]) {
Collection values = new ArrayList();
values.add(2);
values.add(3);
values.add(5);
values.add(4);
Iterator itr = values.iterator();
for(int i = 0 ; i<values.size();i++) {
System.out.println(itr.next());
}
}
}
Run Code Online (Sandbox Code Playgroud)
我还迭代了这个ArrayList。
如果我在创建后添加值,迭代器的对象会抛出异常。
package LearningJava;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Scanner;
public class Java{
public static void main(String args[]) {
Collection values = new ArrayList();
values.add(2);
values.add(3);
values.add(5);
Iterator itr = values.iterator();
values.add(4);
for(int i = 0 ; i<values.size();i++) {
System.out.println(itr.next());
}
}
}
Run Code Online (Sandbox Code Playgroud)
它抛出一个java.util.ConcurrentModificationException. 为什么创建迭代器对象后无法添加值?
仅在 Iterator 接口的情况下抛出此异常。当我创建其他类的对象时,它不会抛出任何异常。
package LearningJava;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.Scanner;
public class Java{
public static void main(String args[]) {
Collection values = new ArrayList();
values.add(2);
values.add(3);
values.add(5);
// creating the object of scanner instead of iterator's.
Scanner input = new Scanner(System.in);
values.add(4);
Iterator itr = values.iterator();
for(int i = 0 ; i<values.size();i++) {
System.out.println(itr.next());
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里没有显示任何错误。为什么是这样?
此行为记录在 的ArrayList文档中:
此类的
iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间对列表进行结构修改,除了通过迭代器自己的remove或add方法之外的任何方式,迭代器将抛出ConcurrentModificationException.
添加元素算作“结构上”修改列表,并注意“创建迭代器之后”的措辞。
当您开始使用 迭代列表时会检测到修改next,这就是引发异常的地方。
另请参阅为什么抛出 ConcurrentModificationException 以及如何调试它以了解有关 aConcurrentModificationException是什么的详细信息,尽管该问题没有具体解决在创建迭代器后立即修改集合而不调用 的情况next。