从循环内的列表中删除元素

Rya*_*yan 4 java arraylist

我正在尝试从循环内的 ArrayList 中删除一个元素。

还行吧。

ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2, 3));
for(Integer i: list){
    if(i == 2)
        list.remove(i);
}
Run Code Online (Sandbox Code Playgroud)

但这不是,并抛出concurrentMODificationException。

 ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2, 3));
 for(Integer i: list){
        list.remove(i);
 }
Run Code Online (Sandbox Code Playgroud)

我不明白为什么。

我刚刚添加了另一个元素,它也不行(抛出 concurrentMODificationException)。

ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4));

System.out.println(list);

for (Integer i : list) {
    if (i == 2)
        list.remove(i);
}
Run Code Online (Sandbox Code Playgroud)

sti*_*nlp 6

使用 Iterator 类而不是 for-each 循环。

Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
   Integer i = it.next();
   it.remove();
}
Run Code Online (Sandbox Code Playgroud)

http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html

例如,通常不允许一个线程修改一个集合,而另一个线程正在对其进行迭代。通常,在这些情况下迭代的结果是不确定的。如果检测到此行为,某些迭代器实现(包括 JRE 提供的所有通用集合实现的实现)可能会选择抛出此异常。这样做的迭代器被称为快速失败迭代器,因为它们快速而干净地失败,而不是冒着在未来不确定的时间出现任意、非确定性行为的风险。

请注意,此异常并不总是表示对象已被不同线程同时修改。如果单个线程发出一系列违反对象约定的方法调用,则该对象可能会抛出此异常。例如,如果线程在使用快速失败迭代器迭代集合时直接修改集合,则迭代器将抛出此异常。

  • 虽然这可能是解决问题的方法,但 OP 也对为什么第一个示例不抛出 `ConcurrentModificationException` 感兴趣。 (2认同)
  • 这就是我必须保护我的问题的原因。请先尝试了解问题的动机。 (2认同)