關於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

相關文章
相關標籤/搜索