Java 为什么ListIterator.add不会引发ConcurrentModificationException,但下面的list.add会引发异常?
嗨,我想了解ListIterator上的add操作是如何工作的。我不明白为什么第7行允许我将项添加到迭代器,第8行抛出ConcurrentModificationException。将项添加到ListIterator与将项添加到列表有什么区别。两者都在努力实现同样的目标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
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。标题上另有说明。