Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么ListIterator.add不会引发ConcurrentModificationException,但下面的list.add会引发异常?_Java_Data Structures - Fatal编程技术网

Java 为什么ListIterator.add不会引发ConcurrentModificationException,但下面的list.add会引发异常?

Java 为什么ListIterator.add不会引发ConcurrentModificationException,但下面的list.add会引发异常?,java,data-structures,Java,Data Structures,嗨,我想了解ListIterator上的add操作是如何工作的。我不明白为什么第7行允许我将项添加到迭代器,第8行抛出ConcurrentModificationException。将项添加到ListIterator与将项添加到列表有什么区别。两者都在努力实现同样的目标 List<String> list = new ArrayList<String>(); list.add("hi"); list.add("whats up"); list.add("how are y

嗨,我想了解ListIterator上的add操作是如何工作的。我不明白为什么第7行允许我将项添加到迭代器,第8行抛出ConcurrentModificationException。将项添加到ListIterator与将项添加到列表有什么区别。两者都在努力实现同样的目标

List<String> list = new ArrayList<String>();
list.add("hi");
list.add("whats up");
list.add("how are you");
list.add("bye");

ListIterator<String> i = list.listIterator();

while (i.hasNext()) {
    System.out.println(i.next());
    list.add("Sample"); // Line #7
    i.add("Test"); // Line #8
}
System.out.println(list);
List List=new ArrayList();
列表。添加(“hi”);
列表。加上(“什么事”);
列表。添加(“你好”);
列表。添加(“再见”);
ListIterator i=list.ListIterator();
while(i.hasNext()){
System.out.println(i.next());
list.add(“Sample”);//第7行
i、 添加(“测试”);//第8行
}
系统输出打印项次(列表);

列表。添加将指定的元素追加到此列表的末尾

ListIterator.add
插入指定的元素,大致说来就是“在当前位置之后”。更准确地说,元素被插入到将由
next()
返回的元素之前(如果有),以及将由
previous()
返回的元素之后(如果有)。同时使用
ListIterator.add添加元素不会产生
ConcurrentModificationException

您将获得
ConcurrentModificationException
,因为您在列表迭代器上迭代时调用了
list.add
。这是由于以下特点:

此类的
迭代器
列表迭代器
方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时候,列表在结构上被修改,除了通过迭代器自己的
删除
添加
方法之外的任何方式,迭代器将抛出一个
ConcurrentModificationException
。因此,在面对并发修改时,迭代器会快速、干净地失败,而不是在将来的不确定时间冒着任意、不确定行为的风险


这正是正在发生的事情。您可以直接修改列表(而不是通过迭代器自己的方法)。

标题正确吗
List.add
不会抛出CME,
ListIterator.add
会抛出CME。标题上另有说明。