为什么禁止在 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循环也可以

原文地址:https://www.cnblogs.com/huzi007/p/10483857.html