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

  • 相关阅读:
    Java实现二叉排序树
    servlet/filter/listener/interceptor区别与联系
    Java中创建对象的5种方式
    字符串练习
    成员变量、类变量、局部变量的区别
    强制清除gradle 缓存
    XML
    jQuery
    JavaScript
    CSS
  • 原文地址:https://www.cnblogs.com/huzi007/p/10483857.html
Copyright © 2020-2023  润新知