遍历时出现ConcurrentModificationException

AI报告撰写实战指南:从提示词工程到全流程优化的底层逻辑与实践突破 传统AI写作常被诟病为“信息拼贴”——模型虽能生成文本,却常出现逻辑断裂、数据矛盾、风格不符等问题。而“全流程优化”则是通过系统化设计,将报告生成拆解为需求解析→数据对齐→提示词设计→初稿生成→迭代优化→格式适配六大环节,每个环节均通过技术手段提升输出质量。提示词工程:本质是通过结构化指令(如角色设定、任务分解、格式约束、示例引导)精准控制模型输出方向,是连接用户需求与模型能力的“翻译器”。全流程优化。 阅读详情

遍历时删除

在遍历List的时时候对List进行remove()后,出现ConcurrentModificationException的问题分析和解决

代码1:

 @Test
    public void test02(){
        List<People> list = new ArrayList<>();
        list.add(new People("张三",21,"男"));
        list.add(new People("小红",20,"女"));
        for (People p:
             list) {
            System.out.println(p);
            if("张三".equals(p.name)) list.remove(p);
        }
    }

代码1的执行结果
在这里插入图片描述
这里并没有出现ConcurrentModificationException

代码2:

@Test
    public void test02(){
        List<People> list = new ArrayList<>();
        list.add(new People("张三",21,"男"));
        list.add(new People("小红",20,"女"));
        list.add(new People("李四",21,"男"));
        for (People p:
             list) {
            System.out.println(p);
            if("张三".equals(p.name)) list.remove(p);
        }
    }

代码2的执行结果:
在这里插入图片描述

这里出现了ConcurrentModificationException

分析
我们这里采用的是foreach遍历,foreach 最终会被转换成迭代器遍历的形式。让我们看看ArrayList里的源码中的next() 和hasNext()

public boolean hasNext() {
            return cursor != size;
        }

        @SuppressWarnings("unchecked")
        public E next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                throw new NoSuchElementException();
            Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
            cursor = i + 1;
            return (E) elementData[lastRet = i];
        }

next()中的checkForComodification()方法如下

final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }

在代码1中,我们的list只有2个People实例

  • 开始第一次遍历的时候,迭代器的cursor为0,ArrayList的size为2,此时hasNext()为True
  • 然后我们在删除第一个People实例,在第二次遍历的时候,迭代器的cursor为1,ArrayList的size为1
  • 此时hasNext()为false,退出遍历。所以代码1的执行结果为一行输出people实例。

在代码2中,我们的list有3个People实例

  • 开始第一次遍历的时候,迭代器的cursor为0,ArrayList的size为2,此时hasNext()为True;
  • 然后我们删除第一个People实例,在第二次遍历的时候,迭代器的cursor为1,ArrayList的size为2,此时hasNext()仍为true,并没有退出遍历
  • 而这时在去调用next()的的时候,next()会去调用checkForComodification()而这时的modCount为4,expectedModCount为3,所以抛出ConcurrentModificationException。

而modCount和expectedModCount是如何计算?
在获取迭代器的时候,迭代器的expectedModCount赋值为list的modCount,如代码2中为3,而往后的list进行remove或者是add等操作时modCount都会进行++操作,这就导致了checkForComodification()时抛出异常。

**解决方法**

1、不要在 foreach 循环里进行元素的 remove/add 操作,remove 元素使用 Iterator 方式

@Test
    public void test03(){
        List<People> list = new ArrayList<>();
        list.add(new People("张三",21,"男"));
        list.add(new People("小红",20,"女"));
        list.add(new People("李四",21,"男"));
        Iterator<People> itr = list.iterator();
        while(itr.hasNext()){
            People p = itr.next();
            if("小红".equals(p.name)){
                itr.remove();
            }
        }
        System.out.println(list);
    }

2、使用下标来进行删除

@Test
    public void test04(){
        List<People> list = new ArrayList<>();
        list.add(new People("张三",21,"男"));
        list.add(new People("小红",20,"女"));
        list.add(new People("李四",21,"男"));
        for(int i = 0; i < list.size(); i++){
            if ("张三".equals(list.get(i).name)) {
                list.remove(i);
            }
        }
        System.out.println(list);
    }
【Web攻防】SQLMap实战进阶:从数据猜解到高权限渗透的全流程指南 本文介绍了SQLMap工具在Web安全渗透测试中的实战应用,重点讲解了数据猜解、高权限操作、复杂请求提交、Tamper脚本开发和指纹绕过等核心场景。文章提供了可直接复用的命令示例,包括数据库信息获取、文件读写、命令执行等操作,并详细说明了POST/JSON/Cookie注入的实现方法。同时,介绍了Tamper脚本的开发模板和指纹伪装技巧,帮助降低检测风险。最后强调SQLMap在自动化渗透全链路中的价值,从漏洞发现到权限提升的完整流程,并提供了优化测试效率的实用建议。所有技术内容仅限合法授权场景使用。 阅读详情

相关推荐

ComfyUI中一个超好用的变量管理类节点-KJNodes

在AI绘图中,ComfyUI的热度开始慢慢起来一些,但是这个软件在使用的过程中,需要很多连线,仅仅一个最简单的动画生成,就需要连接这么多线条,而且有些线会飞的很远,看起来就很不美观,尤其是一些复杂工作流,连接到最后自己可能已经分不太清楚到底连接好了没有。今天在研究C站的大佬们的工作流的时候,发现一个有意思的工作流,看起来大概是这种感觉:干净整洁。他用到了KJNodes这么个节点来管理变量,git上星标也不算很多,所以我想很多朋友可能还不知道,所以这里简单介绍下用法。

聚梦小课堂 7521

使用迭代器遍历List抛出ConcurrentModificationException异常分析。

使用迭代器遍历List抛出ConcurrentModificationException异常分析。

qq_19286785的博客 957

5.2 自抗扰控制 (ADRC)

自抗扰控制(Active Disturbance Rejection Control, ADRC)是由韩京清研究员于1998年提出的一种不依赖被控对象精确数学模型的新型控制技术[reference:0]。其核心思想是将系统的模型不确定性、内部参数摄动以及外部负载变化等所有影响统一定义为“总扰动”,通过一个名为扩张状态观测器(ESO)的环节对其进行实时估计并主动补偿,从而实现动态解耦和强鲁棒性。

技术工作者 1176

有关多线程Map,List遍历时ConcurrentModificationException异常的解决方法

前几天做项目的时候遍历多线程集合的时候遇到异常ConcurrentModificationException,然后在网上搜索了一下,发现是遍历的时候有线程修改了集合导致的,但是我将集合用克隆的方式生成的是一个副本啊,按理说不会出现这种状况啊。 一番排除debug后,发现克隆是浅克隆,集合内部的LinkedList没有克隆出副本,还是引用,所以还是会出现ConcurrentModification...

小咸鱼 954

带有验证码的爆破(包含Burp suite工具爆破)

关于含有验证码爆破的一些总结!

weixin_43960066的博客 8693

STM32 Nucleo-144开发板开箱bring-up

最近做项目,用到STM32F446ZET6这款MCU,为了赶进度,前期软件需要提前开发,于是在某宝买了对应主控的官方开发板,为了避免遗忘,后面能翻出来回忆一些细节,就形成了本篇的主要内容,同时也希望能够帮助刚上手的小伙伴少走弯路,如果对你有帮助请点赞、收藏、转发,谢谢!

汽车电子软件领域知识分享 2678

ConcurrentModifcationException详解

本文主要讲解为什么会产生ConcurrentModifcationException,以及底层代码分析,并且避免产生该异常的方法。 再讲ConcurrentModifcationException的时候,非常必要的说道集合的迭代器,不同的迭代器会产生不同的效果。 Java中的迭代器 快速失败(fail—fast) 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、...

阳阳的博客 2245

ClickHouse集群扩容实战:用clickhouse-copier搞定数据迁移与分片重平衡

本文详细介绍了使用clickhouse-copier工具实现ClickHouse集群从3分片到5分片的平滑扩容实战。通过分片级并行处理、原子性保证等核心机制,该工具能高效完成数据迁移与分片重平衡,同时保持服务连续性。文章涵盖集群拓扑规划、表结构检查、迁移配置、执行监控及迁移后优化等关键步骤,为大数据量场景下的ClickHouse扩容提供完整解决方案。

weixin_29091837的博客 294

Java遍历List和Map出现ConcurrentModificationException异常原因分析及解决方法

Java遍历 List 和 Map 出现 ConcurrentModificationException 异常原因分析及解决方法 一、单线程 异常情况举例 只要抛出出现异常,可以肯定的是代码一定有错误的地方。先来看看都有哪些情况会出现ConcurrentModificationException异常,下面以ArrayList的remove操作进行举例: 使用的数据集合: List myList = new ArrayList(); myList.add( “1”); myList.add( “2

qq_33391863的博客 4346

AI 赋能 DBA:如何用 DeepSeek 等大模型简化数据库管理工作

数据库管理员(DBA)的工作涉及 SQL 优化、故障排查、性能监控等复杂任务。而 DeepSeek、ChatGPT 等大模型可以大幅减少重复劳动,提高 DBA 的工作效率。:某电商平台的订单查询 SQL 执行缓慢(平均 5s),DBA 需要优化。:DBA 需要监控 MySQL 的慢查询,但不想手动写脚本。:某金融系统频繁出现数据库死锁,DBA 需要快速定位原因。:大模型可分析 SQL 执行计划,推荐索引优化方案。:用日常语言查询数据库,无需写复杂 SQL。:一键生成监控、备份、数据迁移脚本。

专注于编程、AI、人工智能等多个领域内容研究和分析 565

基于 Simulink 的**单相全桥 LLC 谐振双向 DC-DC 变换器(带软开关特性)**实战教程

原边(Primary):全桥逆变电路(4个 MOSFET/IGBT),将直流斩波为高频方波。变压器:提供电气隔离和电压变比。副边(Secondary):全波或全桥整流电路(同步整流或二极管)。

xiaoheshang_123的博客 54

Iterator迭代器遍历过程出现ConcurrentModificationException的原因

情况一: 遍历的过程,使用List集合的remove方法删除某个元素,使size的值发生变化,导致 hasNext成立,从而在进行下一步的ite.next()时执行checkForComodification()方法,检查出modCount != expectedModCount成立,最后抛出throw new ConcurrentModificationException()异常。 调试源码核心变量的变化过程如下: 调式源码详细过程如下: 步骤1、首先Debug来到ite.hasNext(); 步骤2

3k油:知道的越多,不知道的越多 1215

手把手教你学Simulink--电机电磁兼容与可靠性​场景示例:基于Simulink的电机轴电压与轴电流抑制仿真

本文带你完成了电机轴电压与轴电流抑制的Simulink仿真,实现了:✅ 揭示了共模电压 → 寄生电容 → 轴电压 → 轴承电蚀的完整链路✅ 搭建了含寄生参数的高频电机等效模型共模电压最小化PWM(源头抑制)dv/dt滤波器(路径阻断)轴接地(终端泄放) ✅ 通过仿真验证了轴电压从68 V降至<3 V的显著效果 ✅ 为高可靠性电机系统提供低成本、高效益的轴承保护方案。

MHD0815的博客 315

java.util.ConcurrentModificationException(集合遍历时不得修改或添加元素)

今天在做HashSet有关的程序时, 遇到了java.util.ConcurrentModificationException错误, 起因是下面这段代码: Set cmpS = new HashSet(); while (!cmpS.equals(ss)) { //当一次搜索之后 ss中的元素没有增加 则退出循环 否则继续对ss中的元素进行搜索 cmpS.addAll(ss)

雷雨中的双桅船 3303

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Map.forEach遍历时,报ConcurrentModificationException解决方法

执行代码是的时候,出现下面异常。 java.util.ConcurrentModificationException at java.util.HashMap.forEach(HashMap.java:1291)  代码: dataStatisticsByMSISDNMap.forEach((key, value)-&gt;{ ...

weixin_39087839的博客 2136

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java List遍历时移除为什么会引发ConcurrentModificationException

发现问题 我们在解Bug的时候,有时候一些问题当时很快解决了,后面再次遇到的时候可能还是会疑惑。就像这个异常: Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) at java.util.ArrayList$Itr.next(ArrayList.java:859) at Tes

zhonglunshun的专栏 521

集合遍历时遇到ConcurrentModificationException的解决办法

大家可能注意到,在用增强for循环或者迭代器去判断并且添加数据时,会出现这个异常 java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) at java.util.ArrayList$Itr.next(ArrayList.java:859) 原因:在迭代器的底层实现中,会去判断两个值,这两个值如果是相等的,则没问题,如果不相等.

ITwuwei的博客 333

Iterator遍历时报错 java.util.ConcurrentModificationException

今天在做安卓应用中的一个删除功能时报错: java.util.ConcurrentModificationExceptiond java.util.ArrayList$ArrayListIterator.next(ArrayList.java:569) 同时选中几条记录进行删除: 程序是这样写的: for(Sample sample : selectedSamples){

小鹰信息技术服务部 1365

集合遍历时删除元素异常(ConcurrentModificationException)分析

传统方式下的Collection在迭代集合时,不允许对集合进行修改。根据AbstractList的checkForComodification方法的源码,分析产生ConcurrentModificationException异常的原因 传统方式下的Collection在迭代集合时,不允许对集合进行修改。 根据AbstractList的checkForComodificati

lin111000713的专栏 1887

【追凶】ArrayList使用增强for循环遍历时删除元素异常ConcurrentModificationException

在工作中我们经常需要在遍历集合的时候删除元素,一开始我也以为只要在增强for循环中remove元素就可以了,现实给了我一个巴掌那就是ConcurrentModificationException。 首先我们创建一个实体类 public class User { private String name; private String adree; public Us...

weixin_41054006的博客 520

关于使用增强for循环遍历时执行删除操作报错 ConcurrentModificationException

1.使用场景; -- 对 ArrayList(数组列表/集合) 进行遍历的时候执行删除操作 2. 异常说明: ConcurrentModificationException -- 这是并发修改异常 3, 产生原因: >>> 在使用增强 for 遍历集合时, 底层其实使用的是迭代器进行遍历的 >>> 源码走向: Iterator<String> iterator = strings.iterator(); iterator >>&g

向明天的美好出发 513

java ArrayList遍历时会报出ConcurrentModificationException,而CopyOmWriteArrayList不会报出的原因

首先说一下,这两个集合的区别在于,一个是线程安全的,一个不是线程安全的。底层都是用数组进行存储,加一个值的时候都会进行数据拷贝。在遍历的时候,ArrayList的迭代器Itr里面有如下属性值:Itr是内部类 int cursor; // index of next element to return int lastRet = -1; // index ...

学习学习再学习 732

ArrayList遍历时add()或者remove()为什么会报ConcurrentModificationException异常

首先分析增强for循环或者迭代器遍历时候的next方法 public E next() { checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementDat

qq_34709656的博客 469

Java foreach遍历时不能用remove Exception in thread “main“ java.util.ConcurrentModificationException

为什么迭代时不能删除元素 // you can not remove item in map when you use the iterator of map // for(Entry<String,String> entry : map.entrySet()){ // if(!entry.getValue().equals(“1”)){ // map.remove(entry.getKey()); // } // } // if you want to remove items, co

weixin_46730700的博客 367

Java 21模式匹配for-each在ArrayList.iterator()遍历时ConcurrentModificationException?PatternSwitch与Fail-Fast机制

ConcurrentModificationException发生在迭代过程中修改集合结构时。ArrayList的fail-fast机制通过modCount来检测并发修改。模式匹配for-each本质上是iterator的语法糖,直接修改集合会导致ConcurrentModificationException。可以使用removeIf()、创建新集合、CopyOnWriteArrayList或迭代器手动遍历来避免ConcurrentModificationException。

weixin_41455464的博客 741

List在遍历时删除元素问题

背景:业务中经常会涉及遍历list时对集合进行插入或者删除操作 文章目录1. 错误方式2. 解决方法 1. 错误方式 先看看下面几段代码,1是foreach的方式去遍历list并删除元素,2是用迭代器的方式遍历list并删除元素,3是下标遍历 1、 foreach public void testDel(){ List<Integer> list = Lists.newArrayList(); for(int i=1;i<=5;i++){ .

weixin_43691723的博客 607

三种骚操作绕过迭代器遍历时的数据修改异常

三种大开脑洞的骚操作。

未读代码 512
上一篇: EL无法使用, 页面显示“${msg}“,而不是msg变量的具体值
下一篇: Linux安装部署Redis(细)
Davin Sun
博客等级 码龄7年 24粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Davin Sun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值