关注「Java视界」公众号,获取更多技术干货

List循环中正确删除元素

List在循环时我们需要根据条件删除该List中满足条件的元素,最先想到的是按照下面的方式:

public class Demo3 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");
        list.add("eee");
        list.add("fff");
        System.out.println("Before :" + list);
        for (String element : list) {
            if (element.equals("ccc")) {
                list.remove(element);
            }
        }
        System.out.println("After :" + list);
    }
}

看起来没什么问题,但是却报如下的错误:

为什么会这样?

首先Java的for循环,就是将List对象遍历托管给Iterator,你如果要对list进行增删操作,都必须经过Iterator。

其实,Iterator可以理解为一个索引,他依靠在其所要迭代的集合上,一旦使用lhm.remove,就会使原来的集合结构遭到破坏,此时原来的集合与iterator的索引结构不一致,自然iterator就会报错。而用iteraotr.remove(),iterator会自动的维护被迭代集合的索引一致性,因此能够正常运行。 

修改成如下就可以正常删除:

public class Demo3 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");
        list.add("eee");
        list.add("fff");
        System.out.println("Before :" + list);
        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()){
            String element = iterator.next();
            if (element.equals("ccc")) {
                iterator.remove();
            }
        }
        System.out.println("After :" + list);
    }
}

结果:

Before :[aaa, bbb, ccc, ddd, eee, fff]
After :[aaa, bbb, ddd, eee, fff]

 

posted @ 2022-06-25 14:02  沙滩de流沙  阅读(1085)  评论(0编辑  收藏  举报

关注「Java视界」公众号,获取更多技术干货