点击上方“方志朋”,选择“设为星标”

回复”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增加、删除、修改元素相关推荐

  1. java 解析/操作 xml 几种常用方式 xml的增加/删除/修改

    java 解析/操作 xml 几种常用方式 xml的增加/删除/修改 首先,我们先介绍几种常用的xml解析器. 1. 介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方 ...

  2. JPA学习笔记---JPA数据的操作:增加,删除,修改,获取,使用JPQL进行查询

    JPA学习笔记---JPA数据的操作:增加,删除,修改,获取,使用JPOL进行查询 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技 ...

  3. php mysql增改删_PHP分享:如何实现MySQL的增加删除修改查看

    原标题:PHP分享:如何实现MySQL的增加删除修改查看 各位朋友,大家上午好! 今天给大家带来的是 如何实现MySQL的增加删除修改查看! 这里就需要用到一个PHP MySQL的增加删除修改查看的类 ...

  4. ArrayList集合为什么不能使用foreach增删改

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 编程过程中常常需要使用到集合,而ArrayList也是我们常常使用 ...

  5. jquery(js) 增加 删除 修改属性样式、元素内容

    引入jquery.js 1.增加或修改样式 $('#id').css('display','none');--根据id设置隐藏 2.$("#id").css({"back ...

  6. python列表可以删除和修改吗_Python列表常见操作详解(获取,增加,删除,修改,排序等)...

    本文实例讲述了Python列表常见操作.分享给大家供大家参考,具体如下: 列表是由一系列按特定顺序排列的元素组成的对象.因为列表通常包含多个元素, 所以建议给列表指定一个表示复数的名称. 我们用方括号 ...

  7. 微信小程序——数组操作 (增加删除修改遍历)map、filter、forEach、find的用法、二维数组,排序,求和、指定长度数组赋值

    一.数组的操作 Array.push() ->在数组后面继续插入内容 Array.pop() ->拿走数组最后一个内容 Array-shift()->拿走数组的第一个内容 (unsh ...

  8. 数据库简介、SQL 语的增加删除修改查询命令

    一.数据库简介 1.使用数据库的必要性 A.结构化存储大量数据,便于高效的检索和访问 B.有效地保持数据信息的一致性.完整性,降低数据冗余 C.满足数据共享和安全方面的要求 2.数据 描述事物的符号记 ...

  9. 工作中遇到的问题--使用注解进行增加删除修改的验证

    自定义验证的注解: /**  * This constraint is to be put on object level for which need to validate on the Prod ...

最新文章

  1. jquery下载教程
  2. 克鲁斯卡尔(并查集)hdu 1233
  3. 2018.08.20高二互测
  4. 【NLP】Pytorch中文语言模型bert预训练代码
  5. VC++动态链接库(DLL)编程深入浅出(zz)
  6. 遍历二叉树的全部方法(递归+非递归)
  7. mysql select 子查询_SELECT中常用的子查询操作
  8. windows下执行testng用例
  9. c#:无限极树形结构
  10. Spark生态之Alluxio学习15--alluxio性能分析和加速方式
  11. android反编译打包出错,APK打包错误,能解决的给红包!
  12. 0x0000011b共享打印机无法连接解决方法
  13. 自己总结出三种进入加密QQ空间的方法
  14. redis 集群详解及搭建过程
  15. 如何把照片压缩到20k一下_如何将一寸照片压缩到20k以内?
  16. java电信计费项目,java毕业设计_springboot框架的电信计费
  17. 使用jquery的bind来检测textarea,input等的文本变化
  18. Mac WiFi速度慢 WiFi卡
  19. 某大型展会现场病毒排查事例及安全规划建议
  20. Centos7 Cacti(仙人掌)

热门文章

  1. 最长递增子序列的两种解法
  2. [Android]webview直接加载网页允许JS,进度条,当前应用内跳转
  3. vc++实现无进程无DLL无硬盘文件无启动项的ICMP后门后门程序
  4. 电子学会青少年编程等级考试Python一级题目解析11
  5. 【青少年编程】【二级】绘制方形螺旋
  6. 技术图文:如何利用BigOne的API制作自动化交易系统 -- 获取账户资产
  7. Twitter 禁止未经用户同意分享照片和视频
  8. 程序员大厂不一定要进,算法必须要学!收藏89篇精选算法文章
  9. 释放联接新价值,华为提出“1+N”5G目标网,推动运营商构筑四大数字化转型的核心能力
  10. @程序员:这些瓜没吃到,可以告别互联网了!