为什么ListIterator.add不抛出ConcurrentModificationException但下面的list.add抛出异常?

时间:2018-04-08 17:38:46

标签: java data-structures

您好我正在尝试了解ListIterator上的添加操作是如何工作的。我不明白为什么第7行允许我将项添加到迭代器,第8行抛出ConcurrentModificationException。向ListIterator添加项目与向List添加项目有什么区别。两人都试图达到同样的目的。

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

1 个答案:

答案 0 :(得分:0)

List.add将指定的元素追加到此列表的末尾。

ListIterator.add粗略地说出“在当前位置之后”指定的元素。更确切地说,元素将紧接在由next()返回的元素之前插入(如果有),并且在previous()返回的元素之后插入(如果有的话)。添加ListIterator.add元素也不会产生ConcurrentModificationException

得到ConcurrentModificationException,因为在迭代列表迭代器时调用list.add。这是由于fail-fast功能:

  

此类的iteratorlistIterator方法返回的迭代器是 fail-fast :如果在创建迭代器后的任何时候对列表进行结构修改,则任何除了通过迭代器自己的removeadd方法之外,迭代器将抛出ConcurrentModificationException。因此,面对并发修改,迭代器会快速而干净地失败,而不是在未来不确定的时间冒着任意的,非确定性行为的风险。

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