当前位置: 首页 > news >正文

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

今天看来一下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.dtcms.com/a/341556.html

    相关文章:

  2. Rust 入门 包 (二十一)
  3. 计算机网络基础复习
  4. 【数据分享】295个地级市互联网用户、邮电业务数据(2001-2022)
  5. win10安装最新docker 4.44.2版图文教程(2025版)
  6. 3.Shell脚本修炼手册之---Shell 变量基础知识
  7. Android动画小补充
  8. 【Obsidian插件】HiNote
  9. 爬虫项目实践之淘宝商品详情数据采集​||电商API接口
  10. 结构化 OCR 技术:破解各类检测报告信息提取难题
  11. 5.Kotlin作用于函数let、run、with、apply、also
  12. SpringCloud微服务架构入门指南
  13. Day12--滑动窗口与双指针--2762. 不间断子数组,LCP 68. 美观的花束,2743. 计算没有重复字符的子字符串数量
  14. day075-MySQL数据库服务安装部署与基础服务管理命令
  15. Unity 开源分享一个轻量路点编辑器插件 常用于对象寻路
  16. 在IDEA中DEBUG调试时查看MyBatis-Plus动态生成的SQL语句
  17. 数据结构:AVL 树
  18. RHCA05-文件系统调优
  19. Spark学习
  20. 游戏本不插电源适配器不卡设置教程
  21. 技术半衰期悖论:AI时代“不可替代领域“的深耕地图
  22. 30.Linux cobbler自动化部署
  23. 生物信息学深度学习模型比较与学习框架
  24. chrome插件开发(一)
  25. 23TaskExecutor初始化
  26. Windows 命令行:dir 命令
  27. MyBatis 动态查询语句详解:让 SQL 更灵活可控
  28. 前端调用阿里云接口语音合成演示
  29. 20人团队文件共享选哪款?群晖DS925+ 和 DS1525+深度对比
  30. 反射基础知识初入(up晚上回家再补完剩下的)
  31. Anomalib:在Linux服务器上安装使用Anomalib 2.1.0