gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:30:53 25 4
gpt4 key购买 nike

我正在学习 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());
}
}
}

我还迭代了这个 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());
}
}
}

它抛出一个java.util.ConcurrentModificationException。为什么创建迭代器对象后无法添加值?

仅在 Iterator 接口(interface)的情况下抛出此异常。当我创建其他类的对象时,它不会抛出任何异常。

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());
}
}
}

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

最佳答案

此行为记录在 ArrayListdocumentation 中:

The iterators returned by this class's iterator and listIterator methods are fail-fast: if the list is structurally modified at any time after the iterator is created, in any way except through the iterator's own remove or add methods, the iterator will throw a ConcurrentModificationException.

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

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

另请参阅Why is a ConcurrentModificationException thrown and how to debug it有关 ConcurrentModificationException 是什么的详细信息,尽管该问题并未具体解决在创建迭代器后立即修改集合而不调用 next 的情况。

关于java - 为什么在创建迭代器对象后无法向 java 中的 ArrayList 添加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73341600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com