理解和解决Java并发修改异常:ConcurrentModificationException
參考文獻:https://www.jianshu.com/p/f3f6b12330c1
文獻来源:简书
关键字: Java Exception
遇到异常信息Exception in thread "main" java.util.ConcurrentModificationException。
假设我们要实现这样一个例子: 判断集合里面有没有"Bi-Hu"这个元素,如果有,就在其后面添加一个"向北"元素
import java.util.*;
public class Main {
public static void main(String[] args) {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("Bi-Hu");
list.add("a");
list.add("a");
Iterator iterator = list.iterator();
while(iterator.hasNext()){
String s = (String) iterator.next();
if ("Bi-Hu".equals(s)){
list.add("向北");
}
}
}
}
那么它是会出现并发异常的 , 因为呢:
- ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
- 产生的原因:
迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。 - 简单描述就是:迭代器遍历元素的时候,通过集合是不能修改元素的。
解决方案:
1.用 for 循环代替 while 增强型for循环也是会报错的
2.不要用 Iterator 换成 ListIterator
这里注意的是:
1.用 ListIterator 后面是 list.listIterator(); 并不是 list.Iterator(); 即:用 Iterator 时 用 list.Iterator() 获取实例 , 用 ListIterator 时 用 list.ListIterator () 获取实例。
2.用list.listIterator时,添加元素时不能用实例来添加 只能通过list迭代器的方法,即:
listIterator.add("Bi-Hu");
import java.util.*;
public class Main {
public static void main(String[] args) {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("Bi-Hu");
list.add("a");
list.add("a");
ListIterator listIterator = list.listIterator();
while (listIterator.hasNext()) {
String str = (String) listIterator.next();
if (str.equals("Bi-Hu")) {
listIterator.add("向北");
}
}
System.out.println(list);
//[a, b, Bi-Hu, 向北, a, a] 可以看到 是在 Bi-Hu 后添加进去
}
}
TiPS: 其实吧 :
listIterator 比 Iterator 功能方法多得多 ,这就要靠你自己去看API了! 不看Api 还学什么编程啊...
总结: 迭代器遍历元素的时候,通过集合是不能修改元素的。
理解和解决Java并发修改异常:ConcurrentModificationException的更多相关文章
- 理解和解决Java并发修改异常ConcurrentModificationException(转载)
原文地址:https://www.jianshu.com/p/f3f6b12330c1 理解和解决Java并发修改异常ConcurrentModificationException 不知读者在Java ...
- 集合框架之——迭代器并发修改异常ConcurrentModificationException
问题: 我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现. 使用普通迭代器出现的异常: ...
- 大杂烩 -- Iterator 并发修改异常ConcurrentModificationException
基础大杂烩 -- 目录 大杂烩 -- Java中Iterator的fast-fail分析 大杂烩 -- Iterator 和 Iterable 区别和联系 问题: 在集合中,判断里面有没有" ...
- 并发修改异常ConcurrentModificationException
1.简述:在使用 迭代器对象遍历集合时,使用集合对象修改集合中的元素导致出现异常 public static void main(String[] args) { List<Integer> ...
- ConcurrentModificationException(并发修改异常)的解决
[异常解释] ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常.[产生的原因] 迭代器是依赖于集合而存在的,在判断成功后,集合 ...
- ConcurrentModificationException 集合并发修改异常 解决
import java.util.ArrayList; import java.util.List; import java.util.ListIterator; /** * 问题? * 有一个集合, ...
- 【Java笔记】以并发修改异常为例总结的出错解决办法
先来看出错代码: /*需求: 遍历已有集合 如果在集合中发现存在字符串元素"world" 则在"world"后添加元素"javaee" */ ...
- java 15 - 8 集合框架(并发修改异常的产生原因以及解决方案)
问题? 我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现. 面试题: Concu ...
- Java基础知识强化之集合框架笔记19:List集合迭代器使用之 并发修改异常的产生原因 以及 解决方案
1. 我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现. ConcurrentModi ...
随机推荐
- 数据序列化工具——flatbuffer
flatbuffer是一款类似于protobuf的数据序列化工具.所有数据序列化,简单来说,就是将某程数据结构按照一定的格式进行编码与解码,以方便在不同的进程间传递后,能够正确的还原成之前的数据结构. ...
- C# 类中操作主窗体控件
主窗体程序: using System; using System.Collections.Generic; using System.ComponentModel; using System.Dat ...
- Nifi组件脚本开发—ExecuteScript 使用指南(三)
上一篇:Nifi组件脚本开发-ExecuteScript 使用指南(二) Part 3 - 高级特征 本系列的前两篇文章涵盖了 flow file 的基本操作, 如读写属性和内容, 以及使用" ...
- css中a元素放长英文字母或者数字自动换行的解决
在做链接分享页面的时候遇到a元素中的下载链接长英文溢出不换行的问题 在给他以及他父元素设置宽度依然没有解决这个问题 最后解决办法给元素加上word-wrap:break-word 解释:使用break ...
- vuex中辅助函数的使用方法
mapState import { mapState } from 'vuex' export default { // ... computed:{ ...mapState({ // 箭头函数可使代 ...
- Docker 一次性进程与对话进程
目录 一次性进程 对话进程 退出的方法 参考 Docker在运行程序的时候,需要区分运行的程序是一次性进程还是对话进程,不同的进程操作方式有差异. 一次性进程 一些简单进程是不需要交互的,比如hell ...
- [转载]Android MVC,MVP和MVVM 思想&例子
在Android开发中,常采用 MVC(Model-View-Controller)或者MVP(Model-View-Presenter) 等框架模式.设计如图 mvc mvp 可以看出,在 MV ...
- Shiro反序列化<=1.2.4 复现
Apache Shiro是一个Java安全框架,执行身份验证.授权.密码和会话管理. shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到reme ...
- slickgrid ( nsunleo-slickgrid ) 1 开篇有益
slickgrid (nsunleo-slickgrid) 1 开篇有益 作为专职的程序猿,自认为是老菜鸟或老民工,以前一直在某浪上写博客,上知天文,下达地理.做了N年的.net,又转Java,从 ...
- POJ_2065 SETI 【同余高斯消元】
一.题目 SETI 二.分析 给定一个模数,一串字符串,字符串长度为N,相当于是N个方程的答案,而这N个方程中有N个未知数,要求的就是这N个未知数的值,很显然的高斯消元,遇到模数和除法,用逆元就好. ...