Java for-each循环(遍历循环)

该文章已生成可运行项目,

Java for-each 循环(增强型遍历循环)详解


一、本质与语法
// 标准语法 (Java 5+)
for (ElementType element : Iterable/Array) {
    // 操作element
}

// 等效传统实现
Iterator<ElementType> it = collection.iterator();
while (it.hasNext()) {
    ElementType element = it.next();
    // 操作element
}
  • 设计目标:简化集合/数组遍历,消除显式迭代器操作
  • 底层机制
    • Iterable对象:自动调用iterator()获取迭代器
    • 对数组:转换为传统索引循环(编译后字节码可见)

二、核心特性
  1. 强制类型安全

    List<String> list = Arrays.asList("A", "B");
    for (Integer num : list) {} // 编译错误:类型不匹配
    
  2. 不可变性保证

    for (final String s : list) { 
        s = "new"; // 编译错误:final修饰符
    }
    
  3. 空指针防护

    for (Object obj : null) { ... } // 运行时抛出NullPointerException
    

三、适用场景与限制
支持的数据结构不支持的操作场景
所有实现Iterable的集合遍历时删除元素(需用Iterator.remove()
数组需要反向遍历
自定义可迭代对象需要同时访问索引

四、典型错误案例
  1. 并发修改异常

    List<String> list = new ArrayList<>(Arrays.asList("A", "B"));
    for (String s : list) {
        list.remove(s); // 抛出ConcurrentModificationException
    }
    

    ✅ 修正方案:改用迭代器遍历 + remove()

  2. 对象引用陷阱

    List<StringBuilder> list = new ArrayList<>();
    list.add(new StringBuilder("Hello"));
    for (StringBuilder sb : list) {
        sb.append(" World"); // 修改对象内部状态 ✔️
        sb = new StringBuilder(); // 仅改变局部引用 ✖️
    }
    

五、性能对比分析
数据结构for-each传统for循环推荐方案
ArrayList迭代器遍历(稍慢)索引直接访问(快)大数据量选传统式
LinkedList迭代器遍历(快)索引遍历(O(n²))必须用for-each
HashSet唯一安全遍历方式无法直接使用索引强制使用for-each

六、高级应用技巧
  1. 多维数组遍历

    int[][] matrix = {{1,2}, {3,4}};
    for (int[] row : matrix) {
        for (int num : row) {
            System.out.print(num + " ");
        }
    }
    
  2. 自定义可迭代对象

    class MyIterable implements Iterable<String> {
        public Iterator<String> iterator() {
            return Arrays.asList("A","B").iterator();
        }
    }
    
  3. 并行遍历优化(Java 8+)

    list.parallelStream().forEach(element -> {
        // 多线程处理(注意线程安全)
    });
    

七、最佳实践指南
  1. 优先选择场景

    • 只读遍历操作
    • 无需索引的线性访问
    • 代码可读性要求高
  2. 规避风险策略

    // 防御性复制(针对可能被修改的集合)
    for (String s : new ArrayList<>(originalList)) {
        originalList.remove(s); // 安全操作
    }
    
  3. 类型推断优化(Java 10+)

    var entries = Map.of(1,"A",2,"B").entrySet();
    for (var entry : entries) {
        System.out.println(entry.getKey() + ":" + entry.getValue());
    }
    

深度扩展:Java 14引入的Records类型可与for-each循环完美配合:

record Point(int x, int y) {}
List<Point> points = List.of(new Point(1,2), new Point(3,4));
for (Point(var x, var y) : points) { // 模式匹配解构(Java 17预览特性)
    System.out.println(x + "," + y);
}
本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值