首页 > 其他 > 详细

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

时间:2021-06-24 15:57:20      阅读:15      评论:0      收藏:0      [点我收藏+]

各种处理方式分析

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);
    }

这里会报一个并发修改异常
技术分享图片

那么这个异常是什么导致的呢。首先我们要明白一点,增强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));
        }
    }

技术分享图片
可以看到此时并没有报错,但是我们发现最终的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));
        }
    }

技术分享图片
结果符合我们的预期哈

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));
        }
    }

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

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

原文:https://www.cnblogs.com/lovelywcc/p/14926608.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!