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

List 循环遍历删除元素

在 Java 中,使用 List 的 remove() 方法在循环遍历时直接删除元素可能会导致 ConcurrentModificationException。这是因为当你在遍历一个集合(如 List)时,修改它的结构(例如添加、删除元素)会使得迭代器失效,进而引发这个异常。

以下是一个可能引发 ConcurrentModificationException 的示例代码:

List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");

for (String item : list) {
    if (item.equals("banana")) {
        list.remove(item); // 这里可能会抛出 ConcurrentModificationException
    }
}

要避免这个问题,你可以使用以下几种方法:

  1. 使用迭代器的 remove() 方法:在循环中使用迭代器的 remove() 方法可以安全地删除元素。

    List<String> list = new ArrayList<>();
    list.add("apple");
    list.add("banana");
    list.add("cherry");
    
    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
        String item = iterator.next();
        if (item.equals("banana")) {
            iterator.remove();
        }
    }
    
  2. 使用 ListIterator:如果你需要在循环中进行多次修改,可以使用 ListIterator,它提供了更多的操作选项,包括插入、删除和替换元素。

    List<String> list = new ArrayList<>();
    list.add("apple");
    list.add("banana");
    list.add("cherry");
    
    ListIterator<String> listIterator = list.listIterator();
    while (listIterator.hasNext()) {
        String item = listIterator.next();
        if (item.equals("banana")) {
            listIterator.remove();
        }
    }
    
  3. 复制原始列表并在副本上进行操作:如果你只是需要删除某些元素,而不需要在循环中添加或修改其他元素,可以先复制原始列表,然后在副本上进行删除操作。

    List<String> originalList = new ArrayList<>();
    originalList.add("apple");
    originalList.add("banana");
    originalList.add("cherry");
    
    List<String> tempList = new ArrayList<>(originalList);
    for (String item : originalList) {
        if (item.equals("banana")) {
            tempList.remove(item);
        }
    }
    
    // 现在 tempList 不包含 "banana",而 originalList 保持不变
    

总之,直接在循环中使用 List 的 remove() 方法可能会导致 ConcurrentModificationException。为了避免这个问题,应该使用迭代器的 remove() 方法、ListIterator 或者复制原始列表并在副本上进行操作。


http://www.kler.cn/news/323593.html

相关文章:

  • 精通推荐算法31:行为序列建模之ETA — 基于SimHash实现检索索引在线化
  • rtsp 协议推流接收(tcp udp)
  • 【深度学习】(9)--调整学习率
  • 后端返回内容有换行标识,前端如何识别换行
  • Linux:LCD驱动开发
  • MySQL:进阶巩固-存储过程
  • 经典Python应用库一览
  • 智慧防灾,科技先行:EasyCVR平台助力地质灾害视频监测系统建设
  • VSCode配置C/C++开发环境
  • MMD模型及动作一键完美导入UE5-Blender方案(三)
  • c++反汇编逆向还原——for循环(笔记)
  • 全景可视化特点+可视化功能实现
  • 【系统规划与管理师】【案例分析】【考点】【问题篇】第10章 团队建设与管理
  • 【AHK】打造炒股利器系列——用关联数组(也称为对象或字典)继续简化语音报时器
  • Vue 组件的三大组成部分详解
  • 批量发送邮件:性能优化与错误处理深度解析
  • 【数据库】Java 中 MongoDB 使用指南:步骤与方法介绍
  • Cesium笔记 canvas定制billboard
  • 音频以及麦克风
  • 【生物服务器】DAP-seq与H3K4me3 ChIP-seq服务,推动表观遗传学研究的创新工具
  • BERT训练之数据集处理(代码实现)
  • 又一条地铁无人线开通!霞智科技智能清洁机器人正式“上岗”
  • 多线程事务管理:Spring Boot 实现全局事务回滚
  • MySQL篇(leetcode刷题100(排序和分组、函数))(一)(持续更新迭代)
  • 华为OD机试真题----BOSS的收入
  • 通过深度学习识别情绪
  • vue3 通过 axios + jsonp 实现根据公网 ip, 查询天气信息
  • Spring Gateway学习
  • 影响上证50股指期货价格的因素有哪些?
  • robomimic基础教程(四)——开源数据集