【问题标题】:Iterating through collection. What are the differences? [duplicate]遍历集合。有什么区别? [复制]
【发布时间】:2013-07-07 11:24:19
【问题描述】:

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

第一:

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

第二:

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

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

【问题讨论】:

  • 查看docs了解更多信息。
  • 第一种情况通常也不是删除对象的好选择。考虑一下,当您删除当前索引处的对象时,列表中的剩余项目和循环索引会发生什么。

标签: java


【解决方案1】:

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

在您的第二个示例中,您使用的“foreach”循环在幕后使用了隐式 Iterator。如果您使用活动的Iterator 自己修改集合,您将获得ConcurrentModificationException

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

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

Iteratorremove 操作允许在不抛出ConcurrentModificationException 的情况下删除元素。

【讨论】:

    【解决方案2】:

    从集合中删除的正确方法是使用第三种循环,如下所示:

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

    【讨论】:

      猜你喜欢
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 2015-11-23
      • 2013-02-13
      相关资源
      最近更新 更多