java 增强型for循环语法详解

 更新时间:2025年04月16日 15:57:59   作者:飞滕人生TYF  
增强型 for 循环(也称为 “for-each” 循环)是 Java 从 JDK 5 开始引入的一种便捷循环语法,旨在简化对数组或集合类的迭代操作,这篇文章主要介绍了java 增强型for循环 详解,需要的朋友可以参考下

Java 增强型 for 循环(Enhanced for Loop)详解

增强型 for 循环(也称为 “for-each” 循环)是 Java 从 JDK 5 开始引入的一种便捷循环语法,旨在简化对数组或集合类的迭代操作。

1. 基本语法

语法格式

for (类型 变量 : 迭代对象) {
    // 循环体
}
  • 类型:迭代对象中元素的类型。
  • 变量:每次迭代时,存储当前元素的变量。
  • 迭代对象:数组或实现了 Iterable 接口的集合(如 ListSet 等)。

2. 使用示例

2.1 遍历数组

public class EnhancedForArray {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5};
        for (int num : numbers) {
            System.out.println(num); // 输出:1, 2, 3, 4, 5
        }
    }
}

2.2 遍历集合

import java.util.ArrayList;
import java.util.List;
public class EnhancedForList {
    public static void main(String[] args) {
        List<String> fruits = new ArrayList<>();
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Cherry");
        for (String fruit : fruits) {
            System.out.println(fruit); // 输出:Apple, Banana, Cherry
        }
    }
}

3. 特性与限制

3.1 特性

简洁性

  • 不需要手动管理索引或迭代器,代码更易读。
  • 对比传统 for 循环,不需要获取数组长度或调用集合的迭代器。

适用性广泛

  • 可用于数组、ListSetMap(遍历 entrySet()keySet()values())。

3.2 限制

无法修改集合结构

  • 增强型 for 循环中,不能直接对集合进行 addremove 操作,否则会抛出 ConcurrentModificationException
  • 示例:
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
for (String s : list) {
    if (s.equals("A")) {
        list.remove(s); // 会抛出异常
    }
}

如果需要修改集合结构,可以使用 迭代器

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String s = iterator.next();
    if (s.equals("A")) {
        iterator.remove(); // 安全地删除元素
    }
}

无法访问索引

增强型 for 循环中无法直接获取元素的索引。如果需要索引,需使用传统 for 循环:

String[] fruits = {"Apple", "Banana", "Cherry"};
for (int i = 0; i < fruits.length; i++) {
    System.out.println("Index " + i + ": " + fruits[i]);
}

只支持顺序访问

适用于 Iterable 接口的集合(如 ListSet),不适用于需要随机访问的场景。

4. 遍历 Map 的增强型 for

4.1 遍历 keySet

遍历 Map 的所有键:

import java.util.HashMap;
import java.util.Map;
public class EnhancedForMap {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("A", 1);
        map.put("B", 2);
        map.put("C", 3);
        for (String key : map.keySet()) {
            System.out.println("Key: " + key + ", Value: " + map.get(key));
        }
    }
}

4.2 遍历 entrySet

更高效地同时遍历键和值:

for (Map.Entry<String, Integer> entry : map.entrySet()) {
    System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}

5. 适用场景

遍历数组

  • 对于大小已知且不需要修改的数组,增强型 for 是最佳选择。

遍历集合

  • 遍历 ListSet 等集合,尤其是当集合不需要修改时。

遍历 Map

  • 使用 entrySet() 时,增强型 for 简洁而高效。

简化代码

  • 避免手动管理索引或迭代器。

6. 常见问题

6.1 为什么增强型 for 循环不能修改集合?

增强型 for 底层使用了 迭代器 来遍历集合,如果直接修改集合结构(如添加或删除元素),会导致迭代器失效,抛出 ConcurrentModificationException

6.2 如何在增强型 for 中访问索引?

可以在增强型 for 中手动维护索引:

String[] fruits = {"Apple", "Banana", "Cherry"};
int index = 0;
for (String fruit : fruits) {
    System.out.println("Index " + index + ": " + fruit);
    index++;
}

7. 底层实现

增强型 for 循环的本质是使用了 迭代器 来实现的。

伪代码

对于 Iterable 对象:

for (Type element : collection) {
    Iterator<Type> it = collection.iterator();
    while (it.hasNext()) {
        Type element = it.next();
        // 循环体
    }
}

对于数组:

for (Type element : array) {
    for (int i = 0; i < array.length; i++) {
        Type element = array[i];
        // 循环体
    }
}

8. 总结

优点

  • 简化代码:适合大多数迭代场景,避免手动处理索引和迭代器。
  • 可读性高:语法简洁,专注于元素处理。

缺点

  • 不能直接操作索引。
  • 不支持修改集合结构。
  • 适用于顺序访问,不适合随机访问场景。

增强型 for 循环是 Java 中对迭代器模式的进一步抽象,它让遍历变得更加简单、高效,是开发中非常常用的工具。

到此这篇关于java 增强型for循环 详解的文章就介绍到这了,更多相关java 增强型for循环内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java异常处理Guava Throwables类使用实例解析

    Java异常处理Guava Throwables类使用实例解析

    这篇文章主要为大家介绍了Java异常处理神器Guava Throwables类使用深入详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • SpringBoot快速入门及起步依赖解析(实例详解)

    SpringBoot快速入门及起步依赖解析(实例详解)

    SpringBoot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程,这篇文章主要介绍了SpringBoot快速入门及起步依赖解析,需要的朋友可以参考下
    2022-10-10
  • Java多线程 volatile关键字详解

    Java多线程 volatile关键字详解

    这篇文章主要介绍了Java多线程 volatile关键字详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • SpringMVC集成FastJson使用流程详解

    SpringMVC集成FastJson使用流程详解

    如果你使用 Spring MVC 来构建 Web 应用并对性能有较高的要求的话,可以使用 Fastjson 提供的FastJsonHttpMessageConverter 来替换 Spring MVC 默认的 HttpMessageConverter 以提高 @RestController @ResponseBody @RequestBody 注解的 JSON序列化速度
    2023-02-02
  • MyBatisPlus之高级查询用法及说明

    MyBatisPlus之高级查询用法及说明

    本文详细介绍了MyBatisPlus的高级查询函数,包括eq、ne、gt、gte、lt、lte、between、notBetween等、like、notLike等、inLeft、isNull、isNotNull、in、NotIn、InSql、NotInSql、GroupBy、OrderBy、Having、Apply、Exists、NotExists、Nested等等查询
    2026-05-05
  • java 实现KMP算法

    java 实现KMP算法

    这篇文章主要介绍了java 如何实现KMP算法,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-12-12
  • Java8中LocalDateTime与时间戳timestamp的互相转换

    Java8中LocalDateTime与时间戳timestamp的互相转换

    这篇文章主要给大家介绍了关于Java8中LocalDateTime与时间戳timestamp的互相转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • mybatis-plus根据指定字段批量,删除、修改实现过程

    mybatis-plus根据指定字段批量,删除、修改实现过程

    本文介绍了三种MyBatis-Plus进行批量删除和修改的方法,第一种是避免手写SQL,第二种是手动获取SqlSessionTemplate,第三种是重写executeBatch方法,虽然批量处理效率较低,但对于不追求性能且不想手写SQL的场景,可以尝试这种方法
    2026-04-04
  • springboot注解Aspect实现方案

    springboot注解Aspect实现方案

    本文提供一种自定义注解,来实现业务审批操作的DEMO,不包含审批流程的配置功能。对springboot注解Aspect实现方案感兴趣的朋友一起看看吧
    2022-01-01
  • 如何用SpringBoot 进行测试

    如何用SpringBoot 进行测试

    这篇文章主要介绍了如何用SpringBoot 进行测试,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下
    2020-11-11

最新评论