list.remove()抛出java.util.ConcurrentModificationException

时间:2013-11-19 00:57:54

标签: java

为什么以下代码抛出java.util.ConcurrentModificationException ??

有人可以解释一般的ConcurrentModificationException并参考这段代码! 感谢。

import java.util.ArrayList;
import java.util.List;

public class Test {
public static void main(String args[]){

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

    list.add("a");
    list.add("b");
    list.add("c");

    for(String s : list){
        if(s.equals("a"));
        list.remove("a");
        }
    System.out.println(list);
    }
}

3 个答案:

答案 0 :(得分:1)

我会保持简单

import java.util.ArrayList;
import java.util.List;

public class Test {
public static void main(String args[]){

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

    list.add("a");
    list.add("b");
    list.add("c");

    int i;

    //Go through each element of list
    for (i = 0; i < list.size(); i++)
    {
        //Test if element needs deleting
        if (list.get(i).equals("a")){
            //Delete element
            list.remove(i);
            //Update reference given element deleted
            i--;
        }
    }
    System.out.println(list);
    }
}

答案 1 :(得分:0)

在迭代集合时,您无法修改集合的内容,因为这会使迭代失效。这样做会导致ConcurrentModificationException。

list.remove("a");

在迭代中并导致异常。

答案 2 :(得分:0)

请参阅documentation

正如它所说:

  

此类的迭代器和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出 ConcurrentModificationException 。因此,面对并发修改,迭代器会快速而干净地失败,而不是在未来不确定的时间冒着任意的,非确定性行为的风险。

可以通过明确使用Iterator

来完成
for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
    if (it.next().equals("a")) {
        it.remove();
    }
}

使用简单的for-each循环,你无权访问迭代器(但它用于运行这样的循环),因此你不能进行任何结构修改。