您好我正在尝试了解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);
答案 0 :(得分:0)
List.add
将指定的元素追加到此列表的末尾。
ListIterator.add
粗略地说出“在当前位置之后”指定的元素。更确切地说,元素将紧接在由next()
返回的元素之前插入(如果有),并且在previous()
返回的元素之后插入(如果有的话)。添加ListIterator.add
元素也不会产生ConcurrentModificationException
。
得到ConcurrentModificationException
,因为在迭代列表迭代器时调用list.add
。这是由于fail-fast功能:
此类的
iterator
和listIterator
方法返回的迭代器是 fail-fast :如果在创建迭代器后的任何时候对列表进行结构修改,则任何除了通过迭代器自己的remove
或add
方法之外,迭代器将抛出ConcurrentModificationException
。因此,面对并发修改,迭代器会快速而干净地失败,而不是在未来不确定的时间冒着任意的,非确定性行为的风险。
这正是发生的事情。您可以直接修改列表(而不是通过迭代器自己的方法)。