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

循环遍历 Java 集合中元素的方法总结

循环遍历 Java 集合中元素的方法

在 Java 中,有多种方法可以遍历集合中的元素。以下是几种常见的遍历方法及其优缺点:

1. for-each 循环
  • 语法

    for (ElementType element : collection) {
        // 处理 element
    }
    
  • 适用场景:所有集合类型(如 ListSetMap 等)。

  • 优点

    • 语法简洁,易于阅读。
    • 遍历效率高,与迭代器类似。
  • 缺点

    • 无法在遍历过程中修改集合(会抛出 ConcurrentModificationException)。
  • 注意事项

    • 基于迭代器实现,与迭代器共享 fail-fast 机制。
2. Iterator 迭代器
  • 语法

    Iterator<ElementType> iterator = collection.iterator();
    while (iterator.hasNext()) {
        ElementType element = iterator.next();
        // 处理 element
        // 可以安全地在遍历中删除元素
        // iterator.remove();
    }
    
  • 适用场景:所有集合类型。

  • 优点

    • 可安全地在遍历过程中删除元素(通过 remove() 方法)。
  • 缺点

    • 无法添加元素(除非使用 ListIterator)。
  • 注意事项

    • fail-fast 机制:检测到结构修改时抛出异常。
    • 需手动管理迭代器生命周期。
3. 普通 for 循环
  • 语法

    for (int i = 0; i < list.size(); i++) {
        ElementType element = list.get(i);
        // 处理 element
    }
    
  • 适用场景List 或数组。

  • 优点

    • 直接通过索引访问,效率高(尤其适合随机访问)。
  • 缺点

    • 仅适用于有序集合(如 List)。
    • 遍历中修改集合可能导致越界异常。
  • 注意事项

    • 需预先获取集合长度(size()),适合需要索引操作的场景。
4. Java 8+ Stream API
  • 语法

    collection.stream().forEach(element -> {
        // 处理 element
    });
    
  • 适用场景:所有集合类型。

  • 优点

    • 支持链式操作(filtermapreduce 等)。
    • 可并行处理(parallel())。
  • 缺点

    • 性能开销较大(创建流对象)。
    • 对简单遍历可能不够高效。
  • 注意事项

    • 惰性求值:需终端操作(如 forEach())触发执行。
    • 不支持直接修改集合。
5. ListIterator
  • 语法

    ListIterator<ElementType> listIterator = list.listIterator();
    while (listIterator.hasNext()) {
        ElementType element = listIterator.next();
        // 处理 element
        // 可以安全地在遍历中增删元素
        // listIterator.remove();
        // listIterator.add(newElement);
    }
    
  • 适用场景List 类型。

  • 优点

    • 双向遍历(正向/反向)。
    • 支持在遍历中增删元素。
  • 缺点

    • 仅适用于 List
    • 逻辑较复杂。
  • 注意事项

    • 维护游标位置需谨慎,避免越界。
    • 与迭代器类似,有 fail-fast 机制。
6. Lambda 表达式
  • 语法

    collection.forEach(element -> {
        // 处理 element
    });
    
  • 适用场景:所有集合类型。

  • 优点

    • 代码简洁。
    • 与 Stream API 结合使用更强大。
  • 缺点

    • 对简单遍历可能冗余。
    • 需 Java 8+ 支持。
  • 注意事项

    • 需配合 forEach() 或 Stream API 使用。
    • 无法在遍历中修改集合。

表格总结优缺点

方法适用场景优点缺点注意事项
for-each循环所有集合类型- 语法简洁
- 遍历效率高(与迭代器类似)
- 无法在遍历过程中修改集合(会抛出 ConcurrentModificationException- 基于迭代器实现,与迭代器共享 fail-fast 机制
Iterator迭代器所有集合类型- 可安全地在遍历中删除元素(remove()- 无法添加元素(除非使用 ListIterator- fail-fast 机制:检测到结构修改时抛出异常
- 需手动管理迭代器生命周期
普通for循环List或数组- 直接通过索引访问,效率高(尤其适合随机访问)- 仅适用于有序集合(如 List
- 遍历中修改集合可能导致越界异常
- 需预先获取集合长度(size()),适合需要索引操作的场景
Java 8+ Stream API所有集合类型- 支持链式操作(filter/map/reduce等)
- 可并行处理(parallel()
- 性能开销较大(创建流对象)
- 对简单遍历可能不够高效
- 惰性求值:需终端操作(如 forEach())触发执行
- 不支持直接修改集合
ListIteratorList类型- 双向遍历(正向/反向)
- 支持在遍历中增删元素
- 仅适用于 List
- 逻辑较复杂
- 维护游标位置需谨慎,避免越界
- 与迭代器类似,有 fail-fast 机制
Lambda表达式所有集合类型- 代码简洁
- 与 Stream API 结合使用更强大
- 对简单遍历可能冗余
- 需 Java 8+ 支持
- 需配合 forEach() 或 Stream API 使用
- 无法在遍历中修改集合

选择建议

  1. 简单遍历

    • for-each循环:语法简洁,适合只读操作。
    • 普通for循环:需索引访问时(如 List)优先选择。
  2. 遍历中修改集合

    • Iterator:安全删除元素(通过 remove())。
    • ListIterator:双向遍历或需增删元素时使用。
  3. 复杂操作(过滤/映射/聚合)

    • Stream API:结合 Lambda 表达式,代码更简洁且功能强大。
  4. 多线程环境

    • 使用 CopyOnWriteArrayList 等线程安全集合,避免 ConcurrentModificationException

通过合理选择遍历方法,可以提升代码的可读性和执行效率。

相关文章:

  • 前端开发:混合技术栈的应用
  • 基于异构特征融合与轻量级集成学习的软件漏洞挖掘方案设计与Python实现
  • Spring Boot + InfluxDB 实现高效数据存储与查询
  • 总结 HTTPS 的加密流程
  • markdown 转 word 工具 ‌Pandoc‌
  • 微信小程序wx.request接口报错(errno: 600001, errMsg: “request:fail -2:net::ERR_FAILED“)
  • 从以太网 II 到 VLAN 和 Jumbo Frame:数据帧格式解读
  • 【xv6操作系统】系统调用与traps机制解析及实验设计
  • 《TCP/IP网络编程》学习笔记 | Chapter 18:多线程服务器端的实现
  • JSON数据对比 vue3 (可直接粘贴食用)
  • vue 自行封装组件,类似于el-tree组件结构
  • 珠算之加减法中出现负数情况
  • 动态IP/静态IP
  • VSTO(C#)Excel开发9:处理格式和字体
  • 回文字串(信息学奥赛一本通-2044)
  • 网易爆米花 1.8.2| 免费无广告,智能刮削,聚合6大网盘,全端无缝看片
  • 【eNSP实战】配置静态NAT
  • 网站后台如何支持富文本配置?实现技术与原理解析
  • Java 实现定长报文模拟器(支持配置文件 默认值)
  • OpenCV特征提取与深度学习CNN特征提取差异
  • 新任美国驻华大使庞德伟抵京履职,外交部回应
  • 不是10点!乌克兰官员称尚未就俄乌谈判开始时间达成一致
  • 小耳朵等来了春天:公益义诊筛查专家走进安徽安庆
  • 浙能集团原董事长童亚辉被查,还是杭州市书法家协会主席
  • 日本航空自卫队一架练习机在爱知县坠毁
  • 美国和沙特签署上千亿美元军售协议