Java码农必须掌握的循环删除List元素的正确方法!

模式苔原
• 阅读 2117

首先看下下面的各种删除list元素的例子

public static void main(String\[\] args) {

    List<String> list = new ArrayList<>(Arrays.asList("a1", "ab2", "a3", "ab4", "a5", "ab6", "a7", "ab8", "a9"));

    /**

     * 报错

     * java.util.ConcurrentModificationException

     */

    for (String str : list) {

        if (str.contains("b")) {

            list.remove(str);

        }

    }

    /**

     * 报错:下标越界

     * java.lang.IndexOutOfBoundsException

     */

    int size = list.size();

    for (int i = 0; i < size; i++) {

        String str = list.get(i);

        if (str.contains("b")) {

            list.remove(i);

        }

    }

    /**

     * 正常删除,每次调用size方法,损耗性能,不推荐

     */

    for (int i = 0; i < list.size(); i++) {

        String str = list.get(i);

        if (str.contains("b")) {

            list.remove(i);

        }

    }

    /**

     * **正常删除,推荐使用**

     */

    for (Iterator<String> ite = list.iterator(); ite.hasNext();) {

        String str = ite.next();

        if (str.contains("b")) {

            ite.remove();

        }

    }

    /**

     * 报错

     * java.util.ConcurrentModificationException

     */

    for (Iterator<String> ite = list.iterator(); ite.hasNext();) {

        String str = ite.next();

        if (str.contains("b")) {

            list.remove(str);

        }

    }

}

报异常IndexOutOfBoundsException我们很理解,是动态删除了元素导致数组下标越界了。

那ConcurrentModificationException呢?

其中,for(xx in xx)是增强的for循环,即迭代器Iterator的加强实现,其内部是调用的Iterator的方法,为什么会报ConcurrentModificationException错误,我们来看下源码

Java码农必须掌握的循环删除List元素的正确方法!

取下个元素的时候都会去判断要修改的数量和期待修改的数量是否一致,不一致则会报错,而通过迭代器本身调用remove方法则不会有这个问题,因为它删除的时候会把这两个数量同步。搞清楚它是增加的for循环就不难理解其中的奥秘了。

推荐去我的博客阅读更多:

1.Java JVM、集合、多线程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、后端、架构、阿里巴巴等大厂最新面试题

觉得不错,别忘了点赞+转发哦!

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
java8 stream初试,map排序,list去重,统计重复元素个数,获取map的key集合和value集合
//定义一个100元素的集合,包含AZList<StringlistnewLinkedList<();for(inti0;i<100;i){list.add(String.valueOf((char)('A'Math.random()('Z''A'1))));}
Wesley13 Wesley13
4年前
java 数据结构(十二):Collections工具类的使用
Collections工具类1.作用:操作Collection和Map的工具类2.常用方法:reverse(List):反转List中元素的顺序shuffle(List):对List集合元素进行随机排序sort(List):根据元素的自然顺序对指定List集合元素升序排序sort(List,Comparator)
Wesley13 Wesley13
4年前
java List 数组删除元素
在java中,ArrayList是一个很常用的类,在编程中经常要对ArrayList进行增、删、改、查操作。之前在学校时一直认为删除操作是最简单的,现在才越发觉得自己愚蠢。只需要设置好预期条件的查询才是最简单的,删除涉及到存储空间的释放,以及数组的遍历等问题,在list的操作中相对还算小老哥呢。这两天在给小程序提供后台接口,因为设计的改变,需要
Kent_Sun Kent_Sun
4年前
java中List数组遍历删除
List数组遍历删除环境jdk8junit单元测试正解java//正解1,jdk自带的addAll方法@Testpublicvoidtest18(){Stringstrs{"12","34","56","78","90"};List<StringlistAr
东方客主 东方客主
4年前
go语言坑之list删除所有元素
go提供了一个list包类似python的list,可以存储任意类型的数据,并提供了相应的API,如下:typeElementfunc(eElement)Next()Elementfunc(eElement)Prev()ElementtypeListfuncNew()Listfunc(lList)
Stella981 Stella981
4年前
Python+Selenium自动化篇
本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子。0.元素定位方法主要有:id定位:find\_element\_by\_id('')name定位:find\_element\_by\_name('')class定位:find\_element\_by\_class\_name(''
Wesley13 Wesley13
4年前
Java 删除List元素的正确方式
方式一:使用Iterator的remove()方法publicclassTest{publicstaticvoidmain(Stringargs){List<StringlistnewArrayList<();list.add("aa"
Stella981 Stella981
4年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
4年前
JAVA中循环删除list中元素的方法总结
印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区。下面就来讲一讲。。伸手党可直接跳至文末。看总结。。  JAVA中循环遍历list有三种方式for循环、增强for循环(也就是常说的foreach循环)、iterator遍历。1、for循环遍
Wesley13 Wesley13
4年前
Java删除List元素的方法
一、正序删正序删,如果只删除至多1个元素,那只需要在删除后使用break语句跳出循环即可,如果需要删除多个元素,若不注意控制当前列表的size和下一个元素的index,容易报_java.lang.IndexOutOfBoundsException_异常publicstaticvoidremove(List<Stringlis