zoukankan      html  css  js  c++  java
  • 为什么禁止在 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循环也可以

  • 相关阅读:
    Linux下启用异步IO
    ORA-20011 ORA-29913 KUP-11024
    OCP 11G 053题库解析汇总链接(601-712)
    OCP 11G 053题库解析汇总链接(201-400)
    OCP 11G 053题库解析汇总链接(401-600)
    OCP 11G 053题库解析汇总链接(1-200)
    OCP 11G 052题库解析汇总链接
    OCP 11G 051题库解析汇总链接
    Vue外部js引入做为全局变量
    Java实现atoi函数
  • 原文地址:https://www.cnblogs.com/huzi007/p/10483857.html
Copyright © 2011-2022 走看看