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循环也可以

  • 相关阅读:
    react:如何创建一个新项目
    python3-多重继承
    Stylus-富有表现力的、动态的、健壮的CSS
    使用@property
    python3-使用__slots__
    python:实例属性和类属性
    java_day1
    学习笔记144—SPSS 重复测量方差分析【方法二】
    学习笔记143—SPSS 重复测量的多因素方差分析
    学习笔记142—Matlab如何读取Excel和写入Excel??
  • 原文地址:https://www.cnblogs.com/huzi007/p/10483857.html
Copyright © 2011-2022 走看看