欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java中List遍历删除元素

程序员文章站 2022-05-16 11:22:25
...

java中List遍历删除元素
原创github_2011 发布于2017-02-08 15:31:55 阅读数 15123  收藏
展开
众所周知,java中对集合的操作属于基础内容,开发Android时间长了,这些基础有些也开始遗忘了,故在此做个总结,方便日后使用。

先说结论:

List集合的遍历删除建议使用迭代器遍历删除操作。

这是List接口中的方法,List集合调用此方法可以得到一个迭代器对象(Iterator)。

for example:

//准备数据
        List<Student> list = new ArrayList<>();
        list.add(new Student("male"));
        list.add(new Student("female"));
        list.add(new Student("female"));
        list.add(new Student("male"));
 
        //遍历删除,除去男生
        Iterator<Student> iterator = list.iterator();
        while (iterator.hasNext()) {
            Student student = iterator.next();
            if ("male".equals(student.getGender())) {
                iterator.remove();//使用迭代器的删除方法删除
            }
        }


这种使用迭代器遍历、并且使用迭代器的删除方法(remove()) 删除是正确可行的,也是开发中推荐使用的。

误区:

如果将上例中的iterator.remove(); 改为list.remove(student);将会报ConcurrentModificationException异常。

这是因为:使用迭代器遍历,却使用集合的方法删除元素的结果。

再说for循环:

总体来说,不建议使用高级for循环(增强for循环)遍历删除/增加操作。

原因就是可能会报ConcurrentModificationException异常。

说可能是比较准确的,可能会报,也可能不报。

总结干货:

1.使用高级for循环遍历删除/增加元素时,如果在某次循环的过程中进行了删除或者是增加元素的操作,使用break或者return语句结束了循环操作,不报异常。

2.使用高级for循环遍历删除/增加元素时,除了1这种情况之外,必报ConcurrentModificationException异常。

验证:

1.break/return 语句结束循环

//准备数据
        List<Student> list = new ArrayList<>();
        list.add(new Student("male"));
        list.add(new Student("female"));
        list.add(new Student("female"));
        list.add(new Student("male"));
 
        //遍历删除增强for循环除去男生
        for (Student student : list) {
            if ("male".equals(student.getGender())) {
                list.remove(student);//使用集合的删除方法删除
                break;//或者return
            }
        }
        Log.d("操作结果:", list.toString());


Log日志为:操作结果:: [Student{gender='female'}, Student{gender='female'}, Student{gender='male'}]

2.其它情况:

        //高级for遍历删除元素,没有break/return
        for(Student student : list){
            if ("male".equals(student.getGender())) {
                list.remove(student);//使用集合的删除方法删除
            }
        }

普通for循环:

普通for循环遍历删除也是可行的,上代码:

//准备数据
        List<Student> list = new ArrayList<>();
        list.add(new Student("male"));
        list.add(new Student("male"));
        list.add(new Student("female"));
        list.add(new Student("female"));
        list.add(new Student("male"));
 
        //普通for循环遍历删除
        for (int i = 0; i < list.size(); i++) {
            Student student = list.get(i);
            if ("male".equals(student.getGender())) {
                list.remove(i);//使用集合的删除方法删除
                i--;//★★★★★ 角标减一
            }
        }
        Log.d("普通for操作结果:", list.toString());


Log日志为:普通for操作结果:: [Student{gender='female'}, Student{gender='female'}]
这种使用普通for循环遍历删除的方法是可行的,但是如果每次删除一个元素之后忘记了将角标减一的话可能会出问题的。

问题:满足条件需要删除的元素没有完全删掉

    

//准备数据
        List<Student> list = new ArrayList<>();
        list.add(new Student("male"));
        list.add(new Student("male"));
        list.add(new Student("female"));
        list.add(new Student("female"));
        list.add(new Student("male"));
 
        //普通for循环遍历删除
        for (int i = 0; i < list.size(); i++) {
            Student student = list.get(i);
            if ("male".equals(student.getGender())) {
                list.remove(i);//使用集合的删除方法删除
                //i--;//★★★★★ 角标不减一
            }
        }
        Log.d("普通for操作结果:", list.toString());


Log日志为:普通for操作结果:: [Student{gender='male'}, Student{gender='female'}, Student{gender='female'}]
结果证明有一个男性的学生没有被删掉,只要有相邻元素A和B都满足删除条件,那么A被删掉,B一定会被保留下来。


————————————————
版权声明:本文为CSDN博主「github_2011」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/github_2011/article/details/54927531

相关标签: 安卓相关