參考連接:阿里巴巴Java開發手冊終極版v1.3.0 java
【強制】不要在 foreach 循環裏進行元素的 remove/add 操做。remove 元素請使用 Iterator 方式,若是併發操做,須要對 Iterator 對象加鎖。 正例: Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String item = iterator.next(); if (刪除元素的條件) { iterator.remove(); } } 反例: List<String> list = new ArrayList<String>(); list.add("1"); list.add("2"); for (String item : list) { if ("1".equals(item)) { list.remove(item); } } 說明:以上代碼的執行結果確定會出乎你們的意料,那麼試一下把「1」換成「2」,會是一樣的 結果嗎?
運行示例代碼:併發
List<String> list = new ArrayList<>(); list.add("1"); list.add("2"); // init list value: [1, 2] System.out.println("init list value: "+list.toString()); // 正例 Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String item = iterator.next(); if ("1".equals(item)) { iterator.remove(); } } // remove 1 result is: iterator list value: [2] // remove 2 result is: iterator list value: [1] System.out.println("iterator list value: "+list.toString()); // 反例 /*for (String item : list) { if ("2".equals(item)) { list.remove(item); } } // remove 1 result is: foreach list value: [2] // remove 2 result is: with below exception *//** * Exception in thread "main" init list value: [1, 2] java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$Itr.next(Unknown Source) at com.jerry.entity.ForEachDemo.main(ForEachDemo.java:32) *//* System.out.println("foreach list value: "+list.toString());*/