通过集合迭代,在循环中删除时避免ConcurrentModificationException

问题:

我们都知道你不能这样做:

for (Object i : l) {
    if (condition(i)) {
        l.remove(i);
    }
}

 ConcurrentModificationException等…这显然是有效的,但并不总是。以下是一些具体代码:
class=”lang-java prettyprint-override”>

public static void main(String[] args) {
    Collection<Integer> l = new ArrayList<Integer>();

    for (int i=0; i < 10; ++i) {
        l.add(new Integer(4));
        l.add(new Integer(5));
        l.add(new Integer(6));
    }

    for (Integer i : l) {
        if (i.intValue() == 5) {
            l.remove(i);
        }
    }

    System.out.println(l);
}
&#91;/code&#93;
这当然会导致:
&#91;code lang="python"&#93;
Exception in thread "main" java.util.ConcurrentModificationException
&#91;/code&#93;
...即使多线程没有做...反正。
这个问题最好的解决方法是什么?如何从循环中的集合中删除项目而不会抛出此异常?
我也在这里使用任意的<code>Collection</code>,不一定是<code>ArrayList</code>,所以你不能依赖<code>get</code>

<h4>回答:</h4>
 <code>Iterator.remove()</code>是安全的,可以这样使用:

List<String> list = new ArrayList<>();

// This is a clever way to create the iterator and call iterator.hasNext() like
// you would do in a while-loop. It would be the same as doing:
//     Iterator<String> iterator = list.iterator();
//     while (iterator.hasNext()) {
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
    String string = iterator.next();
    if (string.isEmpty()) {
        // Remove the current element from the iterator and the list.
        iterator.remove();
    }
}

请注意,Iterator.remove是在迭代期间修改集合的唯一安全方法;如果底层集合在迭代过程中以任何其他方式进行修改,则该行为是未指定的。
资源:
 http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html
同样,如果您有ListIterator并且想要add个项目,则可以使用ListIterator#add,因为您可以使用Iterator#remove xa0 - 它旨在允许它的同样原因。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Iterating through a Collection, avoiding ConcurrentModificationException when removing in loop

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

46 + = 55