目录
  • 简介
  • 实例
  • 正确方法
    • 法1:for的下标倒序遍历
    • 法2: list.stream().filter().collect()
    • 法3: iterator迭代器
  • 错误方法
    • 法1:for(xxx : yyy)遍历
    • 法2:for的下标正序遍历
  • 原因分析

    简介

    本文介绍Java的List的正确的删除方法。

    实例

    需求:有如下初始数据,将list中的所有数据为"b"的元素删除掉。即:填充removeB()方法

    package com.example.a;
     
    import java.util.ArrayList;
    import java.util.List;
     
    public class Demo {
        public static void main(String[] args) {
            List<String> list = new ArrayList<>();
            list.add("a");
            list.add("b");
            list.add("b");
            list.add("c");
            list.add("d");
     
            removeB(list);
        }
     
        private static void removeB(List<String> list) {
            // 待填充
        }
    }
    

    正确方法

    法1:for的下标倒序遍历

    private static void removeB(List<String> list) {
        for (int i = list.size() - 1; i >= 0; i--) {
            if ("b".equals(list.get(i))) {
                list.remove(i);
            }
        }
        System.out.println(list);
    }
    

    结果

    [a, c, d]

    法2: list.stream().filter().collect()

    private static void removeB(List<String> list) {
        List<String> newList = list.stream()
                .filter(e -> !"b".equals(e))
                .collect(Collectors.toList());
        System.out.println(newList);
    }
    

    结果

    [a, c, d]

    法3: iterator迭代器

    private static void removeB(List<String> list) {
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            String s = it.next();
            if ("b".equals(s)) {
                it.remove();
            }
        }
        System.out.println(list);
    }
    

    结果

    [a, c, d]

    错误方法

    法1:for(xxx : yyy)遍历

    private static void removeB(List<String> list) {
        for (String s : list) {
            if ("b".equals(s)) {
                list.remove(s);
            }
        }
        System.out.println(list);
    }
    

    结果(报异常)

    Exception in thread "main" java.util.ConcurrentModificationException
        at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
        at java.util.ArrayList$Itr.next(ArrayList.java:859)
        at com.example.a.Demo.removeB(Demo.java:18)
        at com.example.a.Demo.main(Demo.java:14)

    法2:for的下标正序遍历

    private static void removeB(List<String> list) {
        for (int i = 0; i < list.size(); i++) {
            if ("b".equals(list.get(i))) {
                list.remove(list.get(i));
            }
        }
        System.out.println(list);
    }
    

    结果(有的没有删除掉)

    [a, b, c, d]

    原因分析

    需求:通过遍历把list集合的所有数据删除掉。

    package com.example.a;
     
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.stream.Collectors;
     
    public class Demo {
        private static List<String> list = new ArrayList<>();
     
        public static void main(String[] args) {
            reset();
            // method1();
            // method2();
            // method3();
            // method4();
        }
     
        private static void reset(){
            list.clear();
            list.add("a");
            list.add("b");
            list.add("c");
            list.add("d");
            list.add("e");
        }
     
        /**
         * 方法一:遍历删除第i个元素(错误版)
         * 执行结果:没有完全删除。打印结果:[b, d]
         */
        /**
         * 下面遍历操作过程如下:
         * i = 0    list.size() == 5   执行完第一次list.remove(0);  list剩下[b,c,d,e]
         * i = 1    list.size() == 4   执行完第二次list.remove(1);  list剩下[b,d,e]
         * i = 2    list.size() == 3   执行完第三次list.remove(2);  list剩下[b,d]
         * i = 3    list.size() == 2   i > list.size()所以条件不满足,最后剩下[b,d]
         */
        public static void method1() {
            for (int i = 0; i< list.size(); i++) {
                list.remove(i);
            }
            System.out.println(list);
        }
     
        /**
         * 方法二:删除第0个元素(错误版)
         *  执行结果:元素没有删除。打印结果:[d, e]
         */
        /**
         * 下面遍历操作过程如下:
         * i = 0    list.size() == 5   执行完第一次list.remove(0);  list剩下[b,c,d,e]
         * i = 1    list.size() == 4   执行完第二次list.remove(0);  list剩下[c,d,e]
         * i = 2    list.size() == 3   执行完第三次list.remove(0);  list剩下[d,e]
         * i = 3    list.size() == 2   i > list.size()所以条件不满足,最后剩下[d,e]
         */
        public static void method2() {
            for (int i = 0; i< list.size(); i++) {
                list.remove(0);
            }
            System.out.println(list);
        }
     
        /**
         * 方法三:只取一次长度删除第i个(错误版)
         * 执行结果:报错。打印结果:
         *   Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 2
         */
        /**
         * 只求取list.size()长度一次
         * i == 0 len == 5 list.remove(0) list剩下[b,c,d,e]
         * i == 1 len == 5 list.remove(1) list剩下[b, d,e]
         * i == 2 len == 5 list.remove(2) list剩下[b, d]
         * i == 3 len == 5 list.remove(3) list因为没有第四个元素,于是报索引越界错误
         */
        public static void method3() {
            int len = list.size();
            for (int i = 0; i < len; i++) {
                list.remove(i);
            }
            System.out.println(list);
        }
     
        /**
         * 方法四:只取一次长度删除第0个(正确版)
         * 执行结果:完全删除。打印结果:[]
         */
        /**
         * 下面遍历操作过程如下:
         * i = 0    len == 5   执行完第一次list.remove(0);  list剩下[b,c,d,e]
         * i = 1    len == 5   执行完第二次list.remove(0);  list剩下[c,d,e]
         * i = 2    len == 5   执行完第三次list.remove(0);  list剩下[d,e]
         * i = 3    len == 5   执行完第四次list.remove(0);  list剩下[e]          
         * i = 4    len == 5   执行完第五次list.remove(0);   list剩下[]
         */
        public static void method4() {
            int len = list.size(); // 保证只获取一次长度
            for (int i = 0; i< len; i++) {
                list.remove(0);
            }
            System.out.println(list);
        }
    }
    

    以上就是详解Java中List的正确的删除方法的详细内容,更多关于Java List删除方法的资料请关注其它相关文章!

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。