遍历列表时获取ConcurrentException

M.J*_*.J. 4 java foreach iterator for-loop list

我处于一个非常特殊的状态.我有一个如下列表: -

List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
Run Code Online (Sandbox Code Playgroud)

现在当我进行多种类型的遍历时,比如使用高级for,iterator和normal for循环,下面是示例代码片段: -

1>高级循环: -

try {
    for(String a : list) {
        System.out.println(a);
        list.add("f");
    }
} catch (Exception e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

2>迭代器: -

try {
    Iterator<String> itr =  list.iterator();
    while(itr.hasNext()) {
        System.out.println(itr.next());
        list.add("f");
    }
} catch (Exception e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

3>正常循环: -

for (int i=0;i<list.size();i++) {
    System.out.println(list.get(i));
    list.add("f");
}
Run Code Online (Sandbox Code Playgroud)

现在,一个特殊的问题是,当使用高级for循环和迭代器时,我得到以下异常: -

java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
    at java.util.ArrayList$Itr.next(Unknown Source)


the reason i know, that while iterating through a list, one cannot modify it parallely.
Run Code Online (Sandbox Code Playgroud)

但是,当我使用正常的循环,然后它正常工作,我错过了什么?

请帮忙!!!..

sbr*_*ges 7

如果修改List,则会使从中创建的任何Iterator对象无效.高级循环(1)编译为与迭代器循环(2)几乎相同的代码,这意味着在幕后创建了一个Iterator对象.

ConcurrentMOdificationException的javadoc 有更多详细信息.

如果要在迭代时添加,请使用

ListIterator listIter = ...
while(listIter.hasNext())
{
    if(shouldAdd(iter.next())) {
        iter.add(....)
    }
}
Run Code Online (Sandbox Code Playgroud)