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

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

常见错误1:oop

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

抛出异常:java.util.ConcurrentModificationExceptionrem

常见错误2:get

      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);//[张三, 王五, 陈六]it

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

正确方式for循环

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

相关文章
相关标签/搜索