为什么在创建迭代器对象后无法向 java 中的 ArrayList 添加值

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)

这里没有显示任何错误。为什么是这样?

Swe*_*per 5

此行为记录在 的ArrayList文档中:

此类的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间对列表进行结构修改,除了通过迭代器自己的remove或add方法之外的任何方式,迭代器将抛出ConcurrentModificationException.

添加元素算作“结构上”修改列表,并注意“创建迭代器之后”的措辞。

当您开始使用 迭代列表时会检测到修改next,这就是引发异常的地方。

另请参阅为什么抛出 ConcurrentModificationException 以及如何调试它以了解有关 aConcurrentModificationException是什么的详细信息,尽管该问题没有具体解决在创建迭代器后立即修改集合而不调用 的情况next。