今天看来一下Java中list集合部分的八股,发现了一个以前没注意过的问题,记录一下

list可以一边遍历一边修改元素吗?

答:在 Java 中,List在遍历过程中是否可以修改元素取决于遍历方式和具体的List实现类。

①:对于普通for循环,只要索引不超过list范围,可以一边遍历一遍修改

②:对于foreach循环,如果想边遍历边修改则必须使用迭代器的remove或set方法实现,否则会抛出异常。解释如下:

首先,需要知道的是,foreach循环是基于迭代器实现的,而在迭代器中有这样一个机制,即“快速失败” (Fail-Fast)机制

  1. 快速失败 (Fail-Fast) 机制

这里就提到了一个新的东西叫modCount,这里简单介绍一下:

  1. modCount (Modification Count):

    代码示例

    import java.util.ArrayList;
    import java.util.List;public class FailFastExample {public static void main(String[] args) {// 1. 创建一个ArrayList并添加元素List<String> names = new ArrayList<>();names.add("Alice");names.add("Bob");names.add("Charlie");// 2. 使用foreach循环遍历 (底层使用迭代器)for (String name : names) { // Iterator<String> it = names.iterator();while(it.hasNext()) ...System.out.println(name);// 3. 在迭代过程中,尝试通过集合本身的remove方法删除元素 (错误的做法!)if (name.equals("Bob")) {names.remove("Bob"); // 结构性修改! modCount++!}}}
    }

    对于这段代码的解释:

    关键总结

    1. modCount 是集合的“修改计数器”。 结构性修改会递增它。
    2. 迭代器创建时“拍照”记录 expectedModCount 它期望在迭代过程中,集合的 modCount 不应该改变(除非是迭代器自己的 remove() 方法,该方法会同步更新 expectedModCount)。
    3. next()(和 hasNext())检查一致性。 每次调用 next() 时,都会检查 modCount == expectedModCount
    4. 外部修改导致计数不一致。 如果在迭代过程中,通过集合自身的方法(如 list.add/removemap.put/remove)而非迭代器的 remove() 方法对集合进行了结构性修改,modCount 就会改变,而迭代器的 expectedModCount 不变。
    5. 检测到不一致立即抛出 ConcurrentModificationException 这就是“快速失败”的表现。
    6. foreach 循环依赖迭代器。 因此 foreach 循环天生就带有这种快速失败的特性。
    7. 避免异常: 如果需要在迭代中删除元素,必须使用迭代器自身的 remove() 方法。这个方法在删除元素后,会同步更新 expectedModCount 为新的 modCount,从而保持一致性。

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
    如若转载,请注明出处:http://www.pswp.cn/bicheng/93969.shtml
    繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93969.shtml
    英文地址,请注明出处:http://en.pswp.cn/bicheng/93969.shtml

    如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    Infusing fine-grained visual knowledge to Vision-Language Models

    Infusing fine-grained visual knowledge to Vision-Language Models Authors: Nikolaos-Antonios Ypsilantis, Kaifeng Chen, Andr Araujo, Ondřej Chum Deep-Dive Summary: 视觉-语言模型中注入细粒度视觉知识 摘要 大规模对比预训练产生了强大的视觉-语言模型&#xf…

    RK3576赋能无人机巡检:多路视频+AI识别引领智能化变革

    随着工业巡检任务的复杂度不断提升&#xff0c;无人机逐渐取代传统人工&#xff0c;成为电力、能源、林业、农业等行业的“高空作业主力”。然而&#xff0c;巡检并非简单的拍摄和回放&#xff0c;它要求无人机实时采集多路画面、快速分析异常&#xff0c;并稳定回传数据。这对…

    ollama Modelfile 文件生成

    输入 根据如下TEMPLATE和params写一个modelfile文件&#xff0c;TEMPLATE为&#xff1a;{{- $lastUserIdx : -1 -}} {{- range $idx, $msg : .Messages -}} {{- if eq $msg.Role “user” }}{{ $lastUserIdx $idx }}{{ end -}} {{- end }} {{- if or .System .Tools }}<|i…

    关联规则挖掘2:FP-growth算法(Frequent Pattern Growth,频繁模式增长)

    目录 一、核心思想&#xff1a;一个形象的比喻 二、核心思想的具体拆解 步骤一&#xff1a;构建FP-tree&#xff08;频繁模式树&#xff09; 步骤二&#xff1a;从FP-tree中挖掘频繁项集 为什么这很高效&#xff1f; 三、总结 核心思想与优势 适用场景与缺点 四、例题…

    在IDEA中DEBUG调试时查看MyBatis-Plus动态生成的SQL语句

    在IDEA中DEBUG调试时查看MyBatis-Plus动态生成的SQL语句前言&#xff1a;动态SQL调试的痛与解决方案一、准备工作&#xff1a;调试前的检查清单二、基础方法&#xff1a;SqlSessionTemplate断点调试步骤1&#xff1a;定位SqlSessionTemplate类步骤2&#xff1a;在invoke方法上设…

    Linux 文本处理三剑客:awk、grep、sed 完全指南

    Linux 文本处理三剑客&#xff1a;awk、grep、sed 完全指南 1. 概述 Linux 系统提供了三个强大的文本处理工具&#xff1a;awk、grep 和 sed&#xff0c;它们各有所长&#xff0c;结合使用可以高效地处理文本数据。 awk&#xff1a;擅长文本分析和格式化输出&#xff0c;是一…

    pyecharts可视化图表组合组件_Grid:打造专业数据仪表盘

    pyecharts可视化图表组合组件_Grid&#xff1a;打造专业数据仪表盘 目录pyecharts可视化图表组合组件_Grid&#xff1a;打造专业数据仪表盘引言图表1&#xff1a;Grid-Overlap-多X/Y轴示例代码解析1. 图表创建2. 多轴配置3. 图表重叠4. Grid布局效果与应用图表2&#xff1a;Gri…

    【电气工程学习】

    三极管中&#xff1a;集电极C,基极B&#xff0c;发射极E接线&#xff1a;棕正蓝负黑信号NPN开关输出的是我们的0V,也叫低电平PNP开关输出的是24V,也就是高电平&#xff08;NPN开关导通时&#xff0c;相当于把输出端“拉”到0V&#xff08;低电平&#xff09;&#xff0c;称为“…

    【嵌入式】CAN通信

    CAN 总线最初由博世于1980年代为汽车行业开发&#xff0c;能够简化复杂的布线网络&#xff0c;还确保可靠和安全的数据传输。 1.CAN技术解释 CAN网络中的每个节点&#xff0c;都是平等的&#xff0c;没有主次之分&#xff0c;这一点和SPI和I2C不同。每个节点都可以在需要的时…

    Apache ShenYu网关与Nacos的关联及如何配合使用

    Apache ShenYu 网关与 Nacos 之间的关系可以概括为 “协作互补”:Nacos 作为 服务注册与配置中心,为 ShenYu 提供动态的服务发现和配置管理能力,而 ShenYu 作为 流量网关,依赖 Nacos 实现路由信息的动态更新和实时生效。以下是详细解析: 1. 核心关系图解 拉取服务列表/路…

    【CPP】一个CPP的Library(libXXXcore)和测试程序XXX_main的Demo

    一个CPP的Library和测试程序Demo 1. 思路描述 目录结构 总控CMakeList.txt文件 2. Library代码实现 2.1 XXXLib.hpp文件(对外的接口定义文件)和XXXLib.cpp文件 2.1.1 XXXLib.hpp文件 2.1.2 XXXLib.cpp文件 2.2 CXXXLibApi.hpp文件和CXXXLibApi.cpp文件(内部的API基类) 2.2.1 CX…

    【YashanDB认证】学习YashanDB的探索之路:从入门到实践

    在国产数据库蓬勃发展的浪潮中&#xff0c;选择了YashanDB作为技术学习的切入点。这不仅让我深入了解了数据库的核心技术&#xff0c;也让我深刻体会到国产数据库在性能、可靠性和生态适配上的创新价值。以下是我在学习YashanDB过程中的经验与感悟。 一、YashanDB基础介绍 Ya…

    element UI 和 element plus 在组件上有哪些不同

    Element UI 和 Element Plus 都是基于 Vue 的桌面端 UI 组件库&#xff0c;由同一团队&#xff08;饿了么前端团队&#xff09;开发和维护。Element Plus 是 Element UI 的升级版&#xff0c;专为 Vue 3 设计&#xff0c;而 Element UI 仅支持 Vue 2。以下是它们在组件层面的主…

    【3D重建技术】如何基于遥感图像和DEM等数据进行城市级高精度三维重建?

    城市级高精度三维重建是融合多源空间数据&#xff08;遥感图像、DEM、GIS矢量等&#xff09;、计算机视觉与地理信息处理技术的复杂过程&#xff0c;核心目标是构建包含“地形地物&#xff08;建筑、道路、植被等&#xff09;”的真实、高精度三维场景。其流程可分为数据准备、…

    【unitrix数间混合计算】3.4 无符号小数部分标记trait(bin_unsigned.rs)

    一、源码 这段代码定义了一个类型级二进制小数系统&#xff0c;用于在编译时表示和验证二进制小数部分的有效性。 use crate::number::{F0, BFrac, Bit};/// 标记合法的二进制小数部分类型 pub trait BinFrac: Copy Default static {}// 空小数部分&#xff08;表示值为0&…

    从一次 DDoS 的“死亡回放”看现代攻击链的进化

    本文记录的是作者上周在测试环境真实踩到的坑。为了让读者能复现并亲手体验防御思路&#xff0c;文末给出了一份最小可运行的 Go 脚本&#xff0c;支持本地压测 日志回放&#xff0c;方便对比加防护前后的差异。攻击现场还原 周一凌晨 2:14&#xff0c;监控群里突然弹出告警&a…

    LeetCode热题100--101. 对称二叉树--简单

    1. 题目 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a;输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a;输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 2. 题解 /*** Definition for…

    Pub/Sub是什么意思

    Pub/Sub&#xff08;发布/订阅模式&#xff09;​​ 是一种异步消息通信范式&#xff0c;用于分布式系统中不同组件之间的解耦通信。它的核心思想是将消息的发送方&#xff08;发布者&#xff09;​​ 和接收方&#xff08;订阅者&#xff09;​​ 分离&#xff0c;通过一个中间…

    Redisson3.14.1及之后连接阿里云redis代理模式,使用分布式锁:ERR unknown command ‘WAIT‘

    文章目录一、问题背景1、问题原因2、阿里云对Redisson的支持二、解决方案1、继续使用Redisson3.14.0版本2、阿里云redis改为直连模式3、升级Redisson版本到 3.47.0一、问题背景 1、问题原因 阿里云Redis分直连和代理模式&#xff0c;其中代理模式是不支持WAIT命令的。 目前尝…

    Linux: RAID(磁盘冗余阵列)配置全指南

    Linux&#xff1a;RAID&#xff08;磁盘冗余阵列&#xff09;配置一、RAID 核心概念 RAID&#xff08;Redundant Array of Independent Disks&#xff0c;磁盘冗余阵列&#xff09;通过将多个物理磁盘组合为一个逻辑存储设备&#xff0c;实现提升读写性能、增强数据安全性或平衡…