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

时间:2013-07-09 18:10:38

标签: java

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

第一:

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

第二:

Object ob;
ArrayList<Obect> list;
for(Object o:list)
{ //Todo}

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

2 个答案:

答案 0 :(得分:6)

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

在第二个示例中,您正在使用的“foreach”循环在幕后使用隐式Iterator。如果您使用有效Iterator自行修改收藏集,则会获得ConcurrentModificationException

如果您在使用Iterator时必须删除元素,请使用明确的Iterator

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

允许Iterator的{​​{1}}操作删除元素,而不会抛出remove

答案 1 :(得分:0)

从集合中删除的正确方法是使用第三种类似于此的循环:

    for (Iterator<Object> iterator = new ArrayList<>().iterator(); iterator.hasNext(); ) {
        Object o = iterator.next();
        if (someCondition())
            iterator.remove();
    }