ArrayList集合为什么不能使用foreach增加、删除、修改元素
点击上方“方志朋”,选择“设为星标”
回复”666“获取新整理的面试资料
作者:奋斗的小程序员
toutiao.com/a6754322606561690116
编程过程中常常需要使用到集合,而ArrayList也是我们常常使用的,但是最近在一次删除和增加中出现了一些问题,分享记录下。
请看下面两段代码,哪段代码会报错呢,或者都成功呢。
List<String> arrayList1 = new ArrayList<String>();
arrayList1.add("1");
arrayList1.add("2");
for (String s : arrayList1) {if("1".equals(s)){arrayList1.remove(s);}
}
List<String> arrayList2 = new ArrayList<String>();
arrayList2.add("2");
arrayList2.add("1");
for (String s : arrayList2) {if("1".equals(s)){arrayList2.remove(s);}
}
程序运行结果如下:
arrayList1的remove方法成功执行,但是arrayList2的remove方法运行抛出ConcurrentModificationException异常。
为了寻找原因,我们只能看源代码了。
因为foreach的本质就是使用的迭代器Iterator,所有的Collection集合类都会实现Iterable接口。
找到ArrayList类的iterator()方法
使用自己的Itr内部类,并且实现了Iterator接口
迭代器的本质是先调用hasNext()方法判断存不存在下一个元素,然后再使用next()方法取下一个元素
Itr内部类实现
上面arraylist1为什么能remove成功呢,其实它只循环了一次,所以成功了。
因为它在remove元素1之后,它的size - 1变成1,然后Itr内部的cursor变量由0变成1
此时1 = 1,循环结束,所以成功了。
arraylist2为什么remove失败呢,因为他在循环第二次的时候,也remove成功了,但是第三次判断next的时候cursor的值为2导致不等于现在的size 1,所以执行了next方法,最重要的来了,之前remove的操作导致ArrayList的modCount值加1,然后Itr类中的expectedModCount保持不变,所以会抛出异常。
同理可得,由于add操作也会导致modCount自增,所以不允许在foreach中删除、增加、修改ArrayList中的元素。
对此,推荐大家使用迭代器Iterator删除元素,
Iterator<String> iterator = arrayList2.iterator();
while(iterator.hasNext()){String item = iterator.next();if("1".equals(item)){iterator.remove();}
}
如果存在并发操作,还需要对Iterator进行加锁操作。
如果大家有更好的方式,或者文中有错误的地方,还望批评指正
热门内容:
如何设计 QQ、微信、微博、Github 等等,第三方账号登陆 ?(附表设计)
SpringBoot+Mybatis+Swagger2环境搭建
微服务架构的四大金刚利器
“12306”的架构到底有多牛逼?
别在 Java 代码里乱打日志了,这才是正确的打日志姿势
假如有人把支付宝存储服务器炸了
SpringBoot微信点餐开源系统
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡
ArrayList集合为什么不能使用foreach增加、删除、修改元素相关推荐
- java 解析/操作 xml 几种常用方式 xml的增加/删除/修改
java 解析/操作 xml 几种常用方式 xml的增加/删除/修改 首先,我们先介绍几种常用的xml解析器. 1. 介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方 ...
- JPA学习笔记---JPA数据的操作:增加,删除,修改,获取,使用JPQL进行查询
JPA学习笔记---JPA数据的操作:增加,删除,修改,获取,使用JPOL进行查询 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技 ...
- php mysql增改删_PHP分享:如何实现MySQL的增加删除修改查看
原标题:PHP分享:如何实现MySQL的增加删除修改查看 各位朋友,大家上午好! 今天给大家带来的是 如何实现MySQL的增加删除修改查看! 这里就需要用到一个PHP MySQL的增加删除修改查看的类 ...
- ArrayList集合为什么不能使用foreach增删改
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 编程过程中常常需要使用到集合,而ArrayList也是我们常常使用 ...
- jquery(js) 增加 删除 修改属性样式、元素内容
引入jquery.js 1.增加或修改样式 $('#id').css('display','none');--根据id设置隐藏 2.$("#id").css({"back ...
- python列表可以删除和修改吗_Python列表常见操作详解(获取,增加,删除,修改,排序等)...
本文实例讲述了Python列表常见操作.分享给大家供大家参考,具体如下: 列表是由一系列按特定顺序排列的元素组成的对象.因为列表通常包含多个元素, 所以建议给列表指定一个表示复数的名称. 我们用方括号 ...
- 微信小程序——数组操作 (增加删除修改遍历)map、filter、forEach、find的用法、二维数组,排序,求和、指定长度数组赋值
一.数组的操作 Array.push() ->在数组后面继续插入内容 Array.pop() ->拿走数组最后一个内容 Array-shift()->拿走数组的第一个内容 (unsh ...
- 数据库简介、SQL 语的增加删除修改查询命令
一.数据库简介 1.使用数据库的必要性 A.结构化存储大量数据,便于高效的检索和访问 B.有效地保持数据信息的一致性.完整性,降低数据冗余 C.满足数据共享和安全方面的要求 2.数据 描述事物的符号记 ...
- 工作中遇到的问题--使用注解进行增加删除修改的验证
自定义验证的注解: /** * This constraint is to be put on object level for which need to validate on the Prod ...
最新文章
- jquery下载教程
- 克鲁斯卡尔(并查集)hdu 1233
- 2018.08.20高二互测
- 【NLP】Pytorch中文语言模型bert预训练代码
- VC++动态链接库(DLL)编程深入浅出(zz)
- 遍历二叉树的全部方法(递归+非递归)
- mysql select 子查询_SELECT中常用的子查询操作
- windows下执行testng用例
- c#:无限极树形结构
- Spark生态之Alluxio学习15--alluxio性能分析和加速方式
- android反编译打包出错,APK打包错误,能解决的给红包!
- 0x0000011b共享打印机无法连接解决方法
- 自己总结出三种进入加密QQ空间的方法
- redis 集群详解及搭建过程
- 如何把照片压缩到20k一下_如何将一寸照片压缩到20k以内?
- java电信计费项目,java毕业设计_springboot框架的电信计费
- 使用jquery的bind来检测textarea,input等的文本变化
- Mac WiFi速度慢 WiFi卡
- 某大型展会现场病毒排查事例及安全规划建议
- Centos7 Cacti(仙人掌)
热门文章
- 最长递增子序列的两种解法
- [Android]webview直接加载网页允许JS,进度条,当前应用内跳转
- vc++实现无进程无DLL无硬盘文件无启动项的ICMP后门后门程序
- 电子学会青少年编程等级考试Python一级题目解析11
- 【青少年编程】【二级】绘制方形螺旋
- 技术图文:如何利用BigOne的API制作自动化交易系统 -- 获取账户资产
- Twitter 禁止未经用户同意分享照片和视频
- 程序员大厂不一定要进,算法必须要学!收藏89篇精选算法文章
- 释放联接新价值,华为提出“1+N”5G目标网,推动运营商构筑四大数字化转型的核心能力
- @程序员:这些瓜没吃到,可以告别互联网了!