关于Java集合类迭代删除元素的一些坑

    经常会遇到这样一种情况,对集合类里的元素进行判断,符合条件的元素保留,不符合条件的元素删除。请注意在删除的时候,务必使用迭代器Iterator。

常见错误1:

        ArrayList<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("陈六");
        for(String s : list){
            if(s.equals("张三")){
                list.remove(s);
            }
        }
        System.out.println(list);

抛出异常:java.util.ConcurrentModificationException

常见错误2:

      ArrayList<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("李四");
        list.add("王五");//被跳过判断
        list.add("陈六");
        int loopConut = 0;//循环次数
        for(int i =0;i<list.size();i++){
            loopConut++;
            if(list.get(i).equals("李四")){
                list.remove(i);
            }
        }
        System.out.println(loopConut);//3
        System.out.println(list);//[张三, 王五, 陈六]

注意:这种方式不会抛出异常,但是会出大事。首先,如果在for循环中执行remove操作,导致list的size数量减少,那么被删除元素的下一个元素则会跳过判断。除非在删除元素后,对i进行操作。

正确方式

    ArrayList<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("陈六");
        Iterator<String> it = list.iterator();
        int loopCount = 0;//循环次数
        while(it.hasNext()){
            loopCount++;
            String name = it.next();//必须先it.next(),才能it.remove(),
            System.out.println(name);
            if(name.equals("张三")){
                it.remove();
            }
        }
        System.out.println(loopCount);//4
        System.out.println(list);

    

猜你喜欢

转载自my.oschina.net/u/3733854/blog/1587649