为什么ArrayList集合中不能使用foreach增删改?

Java集合——ArrayList的增删改查 一、首先new一个最基层的对象 ArrayList list = new ArrayList(); 二、添加内容存入ArrayList集合(增) ArrayList<String> str = new ArrayList<String>(10);//创建一个String类型,<>尖括号里面要填包装类型 str.add("葡萄"); str.add("樱... 阅读详情

点击“开发者技术前线”,选择“星标????”

在看|星标|留言,  真爱

来源:http://suo.im/4XaI8Q

编程过程中常常需要使用到集合,而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进行加锁操作。

END


  最后给读者整理了一份大厂面试真题,需要的可扫码加我微信获取。


前线推出学习交流群,加群一定要备注:研究/工作方向+地点+学校/公司+昵称(如前端+上海+上交+可可)根据格式备注,可更快被通过且邀请进群,领取一份专属学习礼包扫码加我微信进群,内推和技术交流,大佬们零距离历史推荐任正非:华为没有 996,更没有 007!
自由了!在字节跳动做码农6年后,28岁郭宇宣布退休!
刷题一个半月,一口气拿下腾讯、华为、Oppo 、微软7个大厂offer,字节跳动薪资涨幅60%!字节跳动禁止国内员工访问海外产品代码库,明日恢复在家远程办公;阿里巴巴,美团暂停往返北京出差活动
好文点个在看吧!
为什么阿里巴巴强制不要在 foreach 里执行删除操作 那天,小二去阿里面试,面试官老王一上来就甩给了他一道面试题:为什么阿里的 Java 开发手册里会强制不要在 foreach 里进行元素的删除操作?小二听完就面露喜色,因为两年前,也就是 2021 年,他在《Java 程序员进阶之路》专栏上的第 63 篇看到过这题????。 PS:star 这种事,只能求,不求没效果,铁子们,《Java 程序员进阶之路》在 GitHub 上已经收获了 523 枚星标,小伙伴们赶紧去点点了,冲 600 star! https://github.com/itwanger/toB 阅读详情

相关推荐

将Python爬取的数据导入钉钉多维表

摘要:本文介绍将Python爬取的数据导入钉钉多维表的完整解决方案。首先通过requests库爬取数据并解析为结构化格式,然后使用钉钉开放平台API对接多维表。关键步骤包括获取app_key、app_secret等凭证,通过OAuth2获取access_token,以及批量写入记录。文章详细说明了参数获取位置、字段类型匹配、权限配置等注意事项,并提供了错误处理建议和性能优化方法。适用于需要将网络数据同步到钉钉多维表的开发场景。

IT深耕十余载,大道之简 2131

每天在使用的await,为什么不能用在forEach中?

不知道你是否写过类似的代码: functiontest(){ letarr=[3,2,1] arr.forEach(asyncitem=&g...

前端下午茶 2872

利用Matlab绘制非线性系统相图:从理论到实践

本文详细介绍了如何利用Matlab进行非线性系统的相图绘制与相平面分析。从理论基础的状态空间转换出发,通过无阻尼线性谐振子和范德波尔振荡器等实例,手把手演示了使用ode45求解器绘制相图、分析平衡点与极限环的完整流程,并分享了方向场绘制、参数分岔探索及常见错误解决方案等高级技巧,为动力学系统分析与控制设计提供了直观强大的可视化工具。

yhn456789的博客 908

foreach, 用还是不用,这是一个问题~

接触过C#循环的朋友,想来对foreach应该不会陌生,相比一般的for循环方式,foreach显得更加优雅简洁,Unity支持C#脚本,平日使用中数组列表什么的自然也会遇到不少,想来foreach定然大有用武之地呀!     可惜网上大家的共识却是:不要用foreach!     WTF?     原因其实也简单,就是为了避免GC,因为foreach会“偷偷”申请内存,使用过度的话自

tkokof1的专栏 2211

wpa_supplicant EAPOL状态机分析

wpa_supplicant EAPOL状态机分析

加油鸭 1477

第12章 STM32+BH1750光照传感器+OLED模块显示环境光照强度

相比光敏传感器,它可以直接输出环境光照强度的数值(范围是0~65535lx),非常适合懒人党,各位的传感器买到手后,赶紧跟着文章试试吧!

qq_44645742的博客 1万+

实验心得:C#中当使用foreach对集合进行遍历时,不得改变集合的大小和元素的值

因为前面老师在讲解集合的时候没有告诉我这条规则,特此记录: 当对集合使用foreach语句进行遍历的时候不能改变集合的大小,不然会抛异常: 如:

孤行者程序之路的博客 6960

Oracle 11g RAC 节点通信故障排查与修复指南

本文详细介绍了Oracle 11g RAC集群发生节点通信故障时的系统性排查与修复方法。当出现节点异常重启时,核心问题往往源于心跳网络中断。文章提供了从快速诊断、日志分析到六层深度检查的完整指南,并给出了针对网络配置、内核参数及Oracle已知Bug等常见根因的实战解决方案,帮助DBA快速恢复集群稳定。

weixin_29246195的博客 279

ArrayList集合不能使用foreach增删改

ArrayList集合不能使用foreach增删改 前言 编程过程中常常需要使用到集合,而ArrayList也是我们常常使用的,但是最近在一次删除和增加中出现了一些问题,分享记录下。 开始 下面两段代码,哪段代码会报错呢。 List<String> arrayList1 = new ArrayList<String>(); arrayList1.add("1"); ar...

Mr_chen的博客 490

软件项目管理期末复习(看这一篇就够了)

软件项目管理考试复习 🔶🔶🔶🔶🔶加了🔶的是考点 第一章软件项目管理概述 1.1.1项目及其特征 项目定义:🔶 项目就是为了创造一个唯一的产品或提供一个唯一的服务而进行的临时性的努力; 是以一套独特而互相联系的任务为前提,有效地利用资源,在一段时间内满足一系列特定目标的多项相关工作的总称。 日常运作和项目的区别: 项目是一次性的,而日常运作是重复进行的。 项目是以目标为导向的,日常运作是通过效率和有效性体现的。 项目是通过项目经理及其团队工作完成的,日常运作是职能式的线性管理。 项目存在大量的变更管理,

qq_50886857的博客 3万+

YOLOv11改进 | Mamba-YOLOv11-L:基于SSM的高效全局建模,精度与效率的双重突破

摘要: 本文提出Mamba-YOLOv11-L,通过集成状态空间模型(SSM)改进YOLOv11的全局建模能力。针对YOLOv11在复杂场景中全局依赖缺失、精度-效率矛盾等问题,SSM以$O(N)$计算复杂度实现长程语义捕捉。改进后的模型在工业缺陷检测(Recall↑12%)、边缘设备部署(内存↓16%)、多尺度目标检测(小目标mAP↑9%)等场景表现优异,推理速度保持>40 FPS。核心创新包括轻量化SSM模块设计(稀疏状态转移+局部上下文融合)及与YOLOv11骨干的深度集成,代码实现展示了SSM

走向CTO的路上... 572

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

点击上方“朱小厮的博客”,选择“设为星标”后台回复”加群“加入公众号专属技术群来源:http://suo.im/4XaI8Q编程过程中常常需要使用到集合,而ArrayList也是我们常常使用的,但是最近在一次删除和增加中出现了一些问题,分享记录下。请看下面两段代码,哪段代码会报错呢,或者都成功呢。List<String>arrayList1=newArrayList<St...

朱小厮的博客 989

2026 拉勾网:JA4+指纹绕过 + sign逆向 + 动态城市参数,月采集10万+数据实战

2026年拉勾网反爬技术全面升级,采用JA4+ TLS指纹识别、动态sign签名等多维度防护体系。本文提供工业级爬虫解决方案,通过curl_cffi模拟浏览器指纹、逆向sign加密算法、动态生成城市参数三大核心技术,实现高效稳定的数据采集。系统采用分层架构设计,包含任务调度、签名生成、多线程引擎等模块,单月可获取10万+条招聘数据。重点解析了JA4+指纹识别原理、传统方法的局限性,以及通过HMAC-SHA256算法逆向sign参数的完整过程。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2395

ArrayList系列--ArrayList集合为什么不能使用foreach增删改?

ArrayList学习系列 ArrayList集合为什么不能使用foreach增删改? 前言:foreach语法糖 ArrayList中使用foreach语法糖,实际内部采用的iterator迭代器方式 List<String> list = new ArrayList<String>(10); list.add("1"); list.add("2"); //方式1 for...

sinat_22143835的博客 862

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

译者:奋斗的小程序员 链接:http://suo.im/4XaI8Q 编程过程中常常需要使用到集合,而ArrayList是我们常常使用的,但是最近在一次删除和增加中出现了一些问题,分享记录下。 分下如下俩段代码 List<String> arrayList1 = new ArrayList<String>(); arrayList1.add("1"); arrayList1...

weixin_44224716的博客 489

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

扫盲!ArrayList集合为什么不能使用foreach增删改?

点击上方"IT牧场",选择"设为星标"技术干货每日送达!译者:奋斗的小程序员链接:http://suo.im/4XaI8Q编程过程中常常需要使用到集合,而...

ITMuch的专栏 253

foreach判断最后一个_ArrayList集合为什么不能使用foreach增删改?

点击上方“Java技术前线”,选择“置顶或者星标”与你一起成长译者:奋斗的小程序员链接:http://suo.im/4XaI8Q编程过程中常常需要使用到集合,而ArrayList也是我们常常使用的,但是最近在一次删除和增加中出现了一些问题,分享记录下。请看下面两段代码,哪段代码会报错呢,或者都成功呢。ListarrayList1=newArrayList();arrayList1...

weixin_39560066的博客 308

foreach判断最后一个_为什么ArrayList集合中不能使用foreach增删改?

点击“开发者技术前线”,选择“星标?”在看|星标|留言, 真爱来源:http://suo.im/4XaI8Q编程过程中常常需要使用到集合,而ArrayList也是我们常常使用的,但是最近在一次删除和增加中出现了一些问题,分享记录下。请看下面两段代码,哪段代码会报错呢,或者都成功呢。ListarrayList1=newArrayList();arrayList1.add("1")...

weixin_39625586的博客 75

Java集合类之List的ArrayList之增删改查

Java集合类之List的ArrayList之增删改查

Need not to know 4595

.foreach()需要判断空吗_rrayList集合为什么不能使用foreach增加、删除、修改元素...

作者:奋斗的小程序员出自:今日头条原文:https://www.toutiao.com/a6754322606561690116编程过程中常常需要使用到集合,而ArrayList也是我们常常使用的,但是最近在一次删除和增加中出现了一些问题,分享记录下。请看下面两段代码,哪段代码会报错呢,或者都成功呢。List<String> arrayList1 = new ArrayList<...

weixin_42515377的博客 913
上一篇: 为什么我强烈推荐你使用 IDEA,放弃 Eclipse?
下一篇: Taro 3 正式版发布!京东推出开放式跨端跨框架方案,这些React、Nerv、Vue、jQuey都能支持上了!...
DevolperFront
博客等级 码龄8年 465粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值