【踩坑系列】Java遍历时删除List元素

847 阅读1分钟

需求

遍历一个List,如果元素符合某个条件,则从List中删除该元素

错误尝试

    for(String str : list){
        if(str.length()>10)
            list.remove(str);
    }

报错:ConcurrentModificationException

报错原因: 元素在使用的时候发生了并发的修改,删除元素后继续循环会导致异常信息,如果删除完毕马上break跳出则不会触发报错。

解决方案

Java中循环遍历List有三种方法:for、foreach、iterator。使用for循环遍历时,删除某个元素后,List的大小发生了变化,因而索引也发生变化,会导致遍历时漏掉某些元素。使用Iterator可以正常遍历及删除。

    Iterator<String> str=list.iterator();
    while(str.hasNext()){
        String x=str.next();
        if(x.length()>10)
            it.remove();
    }

注:使用iterator的remove方法,如果使用List的remove方法,仍然会报ConcurrentModificationException错