通过集合迭代.有什么区别?

use*_*277 -2 java

如果我们有两种迭代方式:

第一:

Object ob;
ArrayList<Obect> list;
for(int i=0;i<list.size();i++)
{ //Todo}
Run Code Online (Sandbox Code Playgroud)

第二:

Object ob;
ArrayList<Obect> list;
for(Object o:list)
{ //Todo}
Run Code Online (Sandbox Code Playgroud)

那有什么区别?我发现在第二种情况下,如果尝试在此循环中删除对象,我会得到并发修改异常.

rge*_*man 6

在第一个示例中,您将自己遍历列表.如果在迭代期间修改集合,则必须负责维护迭代的状态.

在第二个示例中,您正在使用的"foreach"循环使用隐含Iterator的幕后.如果您自己使用活动修改集合Iterator,您将获得一个ConcurrentModificationException.

如果必须在使用时删除元素Iterator,则使用显式Iterator:

for(Iterator<Object> itr = list.iterator(); itr.hasNext())
{
    Object o = itr.next():
    if (decideToRemove)
        itr.remove();
}
Run Code Online (Sandbox Code Playgroud)

所述Iteratorremove操作被允许,而不投掷除去的元素ConcurrentModificationException.