Java中遍历集合的并发修改异常解决方案 我不是女神ヾ 2023-09-26 11:49 67阅读 0赞 ## 遍历集合的删除元素的问题 ## **问题引出**: > 当我们遍历集合从中找出某一批元素并删除的时候, 可能出现一种并发修改异常问题。 **哪些变量会存在这个问题?** > 迭代器遍历集合且直接用集合删除元素的时候可能出现, 例如下面代码就会报错。 public static void main(String[] args) { Collection<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("aaa"); list.add("ddd"); list.add("aaa"); // 删除全部aaa元素 Iterator<String> ite = list.iterator(); while (ite.hasNext()) { String item = ite.next(); if ("aaa".equals(item)) { list.remove("aaa"); } } } > 增强for循环遍历集合且直接用集合删除元素的时候可能出现, 例如下面代码同样会报错。 public static void main(String[] args) { Collection<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("aaa"); list.add("ddd"); list.add("aaa"); for (String item : list) { if ("aaa".equals(item)) { list.remove("aaa"); } } } > Lambda方法遍历同样会出现一样的bug public static void main(String[] args) { Collection<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("aaa"); list.add("ddd"); list.add("aaa"); list.forEach(s -> { if ("aaa".equals(s)) { list.remove("aaa"); } }); } > 使用for循环, 不会报错, 但是删除数据会出现问题, 例如下面代码中会漏删aaa public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("aaa"); list.add("aaa"); list.add("ccc"); list.add("aaa"); list.add("ddd"); list.add("aaa"); for (int i = 0; i < list.size(); i++) { String item = list.get(i); if ("aaa".equals(item)) { list.remove("aaa"); } } System.out.println(list); // [ccc, ddd, aaa] } **解决方案**: > 迭代器的解决方法: 迭代器遍历集合但是用迭代器自己的删除方法操作可以解决。 public static void main(String[] args) { Collection<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); list.add("ccc"); list.add("aaa"); list.add("ddd"); list.add("aaa"); // 删除全部aaa元素 Iterator<String> ite = list.iterator(); while (ite.hasNext()) { String item = ite.next(); if ("aaa".equals(item)) { // shiy 迭代器删除方法, 删除当前所在元素 ite.remove(); } } System.out.println(list); // [bbb, ccc, ddd] } > for循环的解决方法一: 从后往前删 public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("aaa"); list.add("aaa"); list.add("ccc"); list.add("aaa"); list.add("ddd"); list.add("aaa"); for (int i = list.size() - 1; i >= 0; i--) { String item = list.get(i); if ("aaa".equals(item)) { list.remove("aaa"); } } System.out.println(list); // [ccc, ddd] } > for循环的解决方法二: 删除完元素让 i 减1, `i--` public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("aaa"); list.add("aaa"); list.add("ccc"); list.add("aaa"); list.add("ddd"); list.add("aaa"); for (int i = 0; i < list.size(); i++) { String item = list.get(i); if ("aaa".equals(item)) { list.remove("aaa"); // 删除了元素i-- i--; } } System.out.println(list); // [ccc, ddd] }
相关 Java集合框架中的遍历问题及解决方案 在Java的集合框架中,遍历问题主要涉及到List、Set和Map等不同类型的集合。 1. List遍历: - 使用for-each循环:`for (Element e 川长思鸟来/ 2024年09月19日 06:57/ 0 赞/ 7 阅读
相关 理解和解决Java集合类遍历异常问题 在Java中,当处理集合类(如List或Set)的遍历时,可能会遇到一些异常。以下是常见的几种异常以及解决方法: 1. **IndexOutOfBoundsException ╰+哭是因爲堅強的太久メ/ 2024年09月17日 00:57/ 0 赞/ 5 阅读
相关 Java中的集合类遍历异常:NullPointer与IndexOutOfBoundsException 在Java中,当操作集合(如List、Set或Map)时,可能会遇到两种常见的异常: 1. `NullPointerException`: - 当试图访问一个null对 喜欢ヅ旅行/ 2024年09月12日 22:06/ 0 赞/ 9 阅读
相关 Java集合框架遍历异常剖析 在Java的集合框架中,遍历过程中可能会遇到一些异常。这里主要分析几种常见的异常: 1. `ConcurrentModificationException`:当一个集合正在被 深藏阁楼爱情的钟/ 2024年09月11日 01:21/ 0 赞/ 22 阅读
相关 Java中遍历集合的并发修改异常解决方案 遍历集合的删除元素的问题 问题引出: > 当我们遍历集合从中找出某一批元素并删除的时候, 可能出现一种并发修改异常问题。 哪些变量会存在这个问题? > 迭代器遍历集 我不是女神ヾ/ 2023年09月26日 11:49/ 0 赞/ 68 阅读
相关 Java集合中迭代器遍历过程的并发修改异常问题(Debug模式追踪) 我们在使用迭代器Iterator遍历集合中元素的过程中修改集合中元素的操作会抛出一个并发修改异常: ConcurrentModificatio 朱雀/ 2022年11月25日 10:19/ 0 赞/ 145 阅读
相关 关于java集合的遍历以及ConcurrentModificationException(并发操作异常) 遍历集合的常用方法一(Iterator(迭代器)遍历): 迭代器接口Iterator Iterator it = collection.iterator(); //返回 叁歲伎倆/ 2022年08月18日 13:21/ 0 赞/ 153 阅读
相关 Java多线程中集合遍历并发修改异常解决办法 java.util.ConcurrentModificationException异常 使用并发集合替换掉原集合可以实现并发修改安全。 <table> 淩亂°似流年/ 2021年12月03日 05:31/ 0 赞/ 371 阅读
相关 - 集合 遍历 foreach Iterator 并发修改 ConcurrentModificationException MD 目录 目录 为什么不能在 foreach 循环里进行元素的 remove/add 操作 背景 foreach 循环 末蓝、/ 2021年10月29日 15:44/ 0 赞/ 280 阅读
还没有评论,来说两句吧...