List過濾資料ConcurrentModificationException的坑

weixin_34148456發表於2017-05-11

今天專案需要將採集到List資料過濾,SoEasy!刷刷的寫下了以下程式碼:

 public static void main(String[] args) {
        Filter filter = new Filter();
        List<String> sss = new ArrayList<>();
        sss.add("1");
        sss.add("22");
        sss.add("333");
        sss.add("4444");
        filter.filter(sss);
        for (String ss : sss) {
            System.out.println(ss);
        }
    }

    public static class Filter {
        /**
         * @param source 傳入的要過濾的源資料
         * @return 將過濾後的資料返回
         */
        public List<String> filter(List<String> source) {
            for (String ss : source) {
                if (ss.length() < 3) {
                    source.remove(ss);
                }

            }
            return source;
        }
    }

一執行,結果

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
    at java.util.ArrayList$Itr.next(ArrayList.java:851)
    at Main$Filter.filter(Main.java:37)
    at Main.main(Main.java:25)

先說怎麼解決,就是Itorator去處理,只貼fiter方法:

 public List<String> filter(List<String> source) {
            Iterator<String> iterator = source.iterator();
            while (iterator.hasNext()) {
                if (iterator.next().length() < 3) {
                    iterator.remove();
                }
            }
            return source;
        }

執行結果正確:

333
4444

相關文章