• 对集合中元素的删除为什么要使用迭代器


    各种处理方式分析

    1.在增强for循环中使用remove删除

        public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<>();
            list.add("1");
            list.add("2");
            list.add("3");
            list.add("4");
            list.add("5");
            for (String s : list) {
                if (s.equals("5")) {
                    list.remove(s);
                }
            }
            System.out.println(list);
        }
    

    这里会报一个并发修改异常
    image

    那么这个异常是什么导致的呢。首先我们要明白一点,增强for循环,在编译过后遍历是通过迭代器来实现,也正是这个实现方式,导致出现了问题。

    2.普通for循环删除

    public static void main(String[] args) {
            List<String> list = new ArrayList<>();
            list.add("a");
            list.add("b");
            list.add("d");
            list.add("d");
            list.add("d");
            list.add("d");
            list.add("f");
            for (int i = 0; i < list.size(); i++) {
                if (list.get(i).equals("d")) {
                    list.remove(i);
                }
            }
            for (int j = 0; j < list.size(); j++) {
                System.out.println(list.get(j));
            }
        }
    

    image
    可以看到此时并没有报错,但是我们发现最终的list里并没有将所有的"d"删除,并不是我们想要的结果,即这种方式删除的时候,不会报错,但是当遇到连续要删除的值的时候,就会漏删。因为当你删除的时候,后面一个索引就往前移了一个,但是i的值还在增加,所以导致漏删的情况。

    3.正确方式:使用迭代器进行删除

        public static void main(String[] args) {
            List<String> list = new ArrayList<>();
            list.add("a");
            list.add("b");
            list.add("d");
            list.add("d");
            list.add("d");
            list.add("d");
            list.add("f");
    
            Iterator<String> iterator = list.iterator();
            while (iterator.hasNext()) {
                if (iterator.next().equals("d")) {
                    iterator.remove();
                }
            }
            
            for (int j = 0; j < list.size(); j++) {
                System.out.println(list.get(j));
            }
        }
    

    image
    结果符合我们的预期哈

    4.jdk1.8后的快捷方式

        public static void main(String[] args) {
            List<String> list = new ArrayList<>();
            list.add("a");
            list.add("b");
            list.add("d");
            list.add("d");
            list.add("d");
            list.add("d");
            list.add("f");
    
            List<String> collect = list.stream().filter(new Predicate<String>() {
                @Override
                public boolean test(String s) {
                    return !s.equals("d");
                }
            }).collect(Collectors.toList());
    
            for (int j = 0; j < collect.size(); j++) {
                System.out.println(collect.get(j));
            }
        }
    

    image
    可以看到转化为流之后使用filter方式很轻松的就达到了我们想要的结果。

    艾欧尼亚,昂扬不灭,为了更美好的明天而战(#^.^#)
  • 相关阅读:
    JavaScript循环 — for、for/in、while、do/while
    Git
    js根据日期获取所在周
    nodejs安装 Later version of Node.js is already installed. Setup will now exit 及 node与npm版本不符
    sqlserver 2014 json
    根据官方数据制作中国省市区数据库
    kubernetes系列③:集群升级-实践(参照官方文档)
    kubernetes系列:服务外部访问集中管理组件-ingress-nginx
    kubernetes系列-部署篇:Kubernetes的包管理工具-helm
    kubernetes系列-部署篇:使用kubeadm初始化一个高可用的Kubernetes集群
  • 原文地址:https://www.cnblogs.com/lovelywcc/p/14926608.html
Copyright © 2020-2023  润新知