收集迭代时删除元素

时间:2010-12-21 10:20:56

标签: java collections

当我执行以下代码安静时,我想知道幕后真的发生了什么:

    List<Object> list = new ArrayList<Object>();
    fillTheList(); // Filling a list with 10 objects
    int count = 0;
    for (Object o : list) {
        count++;
        if (count == 5) {
            list.remove(count);
        }
        o.toString();
     }

删除元素后,我收到ConcurrentModificationException异常。

我不明白为什么在删除它之后的一个元素不可能只是在集合中使用下一个元素并继续循环。

3 个答案:

答案 0 :(得分:7)

获取Iterator而不是在for循环中使用迭代器:

int count = 0;

for(final Iterator iterator = list.iterator(); iterator.hasNext();) {
    final Object o = iterator.next();

    if (++count == 5) {
        iterator.remove();
    }

    o.toString();
}

编辑:您获得ConcurrentModificationException的原因是因为for循环使用了在您进行修改之前创建的其他Iterator list.remove() Iterator内部有州。

答案 1 :(得分:1)

基本上你不允许在foreach循环中引用集合(本例中为list)。

请改为尝试:

List<Object> list = new ArrayList<Object>();
fillTheList(); // Filling a list with 10 objects
int count = 0;
ListIterator<Object> it = list.listIterator();
while (it.hasNext()) {
    Object o = it.next();
    count++;
    if (count == 5) {
        it.remove();
    }
    o.toString();
}

答案 2 :(得分:0)

通常有更好的方法来执行此操作,而不是使用iterator.remove()。例如在你的情况下,循环与

相同
if(list.size()> 5) list.remove(5);

如果你确实需要使用iterator.remove(),你仍然可以使用for循环。

for(Iterator iterator = list.iterator(); iterator.hasNext();) {
    final Object o = iterator.next();

    if (++count == 5)
       iterator.remove();

    o.toString();
}