参考连接:阿里巴巴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());*/