在列表迭代期间从java.util.List中删除元素时引发并发ModificationException?

2022-08-31 14:53:55
@Test
public void testListCur(){
    List<String> li=new ArrayList<String>();
    for(int i=0;i<10;i++){
        li.add("str"+i);
    }

    for(String st:li){
        if(st.equalsIgnoreCase("str3"))
            li.remove("str3");
    }
    System.out.println(li);
}

当我运行此代码时,我将抛出一个.ConcurrentModificationException

看起来好像当我从 中删除指定的元素时,不知道它已被更改。listlistsize

我想知道这是否是删除元素的常见问题?collections


答案 1

我相信这就是 Iterator.remove() 方法背后的目的,能够在迭代时从集合中删除元素。

例如:

Iterator<String> iter = li.iterator();
while(iter.hasNext()){
    if(iter.next().equalsIgnoreCase("str3"))
        iter.remove();
}

答案 2

在没有迭代器的情况下将其从列表中删除的Java 8方法是:

li.removeIf(<predicate>)

List<String> li = new ArrayList<String>();
// ...
li.removeIf(st -> !st.equalsIgnoreCase("str3"));