为什么禁止在 foreach 循环里进行元素的 remove/add 操作
先看一个例子:
1 import java.util.ArrayList; 2 import java.util.List; 3 4 public class Test { 5 6 public static void main(String[] args) { 7 // 初始化一个List 8 List<String> userNames = new ArrayList<String>() {{ 9 add("Hollis"); 10 add("hollis"); 11 add("HollisChuang"); 12 add("H"); 13 }}; 14 15 userNames.stream().forEach(s->{ 16 userNames.add("qqq"); 17 userNames.remove("H"); 18 }); 19 userNames.stream().forEach(s->{ 20 System.out.println(s); 21 }); 22 } 23 }
在一个增强for循环中对集合元素进行添加与删除,然后执行这个代码,结果:抛出异常
Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1386) at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580) at com.lujiangchuangzhu.seventeen.admin.service.util.Test.main(Test.java:16)
为什么呢,请看这篇文章:https://juejin.im/entry/5c7c7cae518825620677eebb
解决方法,用迭代器:
1 import java.util.ArrayList; 2 import java.util.Iterator; 3 import java.util.List; 4 5 6 public class Test { 7 8 public static void main(String[] args) { 9 // 初始化一个List 10 List<String> userNames = new ArrayList<String>() {{ 11 add("Hollis"); 12 add("hollis"); 13 add("HollisChuang"); 14 add("H"); 15 }}; 16 17 /** 18 * 迭代器解决方案 19 */ 20 Iterator<String> strings= userNames.iterator(); 21 while (strings.hasNext()){ 22 String str=strings.next(); 23 if(str.equals("H")){ 24 strings.remove(); 25 } 26 } 27 userNames.stream().forEach(s->{ 28 System.out.println(s); 29 }); 30 } 31 }
解决方法二:用普通for循环也可以