杰瑞科技汇

Java for循环遍历数组有几种方式?

传统 for 循环 (基于索引)

这是最经典、最通用的循环方式,适用于几乎所有编程语言,它通过数组的索引(从 0 开始)来逐个访问元素。

Java for循环遍历数组有几种方式?-图1
(图片来源网络,侵删)

语法:

for (int i = 0; i < array.length; i++) {
    // 访问 array[i]
}

参数说明:

  • int i = 0: 初始化循环变量 i,数组索引从 0 开始。
  • i < array.length: 循环条件,只要 i 小于数组的长度(即 array.length),循环就会继续。注意: 这里是 < 而不是 <=,因为最大有效索引是 array.length - 1
  • i++: 循环后的操作,每次循环结束后,i 的值增加 1。

示例代码:

public class TraditionalForLoop {
    public static void main(String[] args) {
        // 1. 定义一个整型数组
        int[] numbers = {10, 20, 30, 40, 50};
        System.out.println("使用传统 for 循环遍历数组:");
        // 2. 使用 for 循环遍历
        for (int i = 0; i < numbers.length; i++) {
            // 通过索引访问数组元素
            System.out.println("元素索引 " + i + ": " + numbers[i]);
        }
    }
}

输出:

Java for循环遍历数组有几种方式?-图2
(图片来源网络,侵删)
使用传统 for 循环遍历数组:
元素索引 0: 10
元素索引 1: 20
元素索引 2: 30
元素索引 3: 40
元素索引 4: 50

优点:

  • 通用性强: 适用于所有类型的数组。
  • 灵活: 在循环体内可以方便地使用索引 i,可以访问前一个或后一个元素 (numbers[i-1], numbers[i+1]),或者根据索引进行特殊处理。

缺点:

  • 代码稍显冗长: 需要手动声明、初始化和更新索引变量。

增强型 for 循环 (For-Each 循环)

这是 Java 5 引入的一种更简洁、更安全的循环方式,专门用于遍历集合(如数组、List、Set 等),它隐藏了索引的细节,让你专注于元素本身。

语法:

Java for循环遍历数组有几种方式?-图3
(图片来源网络,侵删)
for (元素类型 变量名 : 数组名) {
    // 使用 变量名 访问当前元素
}

参数说明:

  • 元素类型: 数组中每个元素的类型(int, String)。
  • 变量名: 一个临时变量,在每次循环中会自动被赋值为数组中的下一个元素。
  • 数组名: 你要遍历的数组。

示例代码:

public class EnhancedForLoop {
    public static void main(String[] args) {
        // 1. 定义一个字符串数组
        String[] fruits = {"Apple", "Banana", "Cherry", "Date"};
        System.out.println("使用增强型 for 循环 (for-each) 遍历数组:");
        // 2. 使用 for-each 循环遍历
        for (String fruit : fruits) {
            // fruit 变量会依次接收数组中的每个元素
            System.out.println("水果: " + fruit);
        }
    }
}

输出:

使用增强型 for 循环 (for-each) 遍历数组:
水果: Apple
水果: Banana
水果: Cherry
水果: Date

优点:

  • 代码简洁: 无需关心索引,代码更易读。
  • 更安全: 不会出现数组越界(ArrayIndexOutOfBoundsException)的错误,因为它自动处理了索引边界。
  • 不易出错: 避免了手动管理索引时可能犯的错误(忘记 i++i < 写成 i <=)。

缺点:

  • 无法获取索引: 如果你需要在循环中知道当前元素的索引,for-each 循环无法直接提供。
  • 无法修改数组元素:for-each 循环中,你只能读取元素的值,不能修改数组本身,下面的代码是无效的:
    for (int number : numbers) {
        number = 100; // 这只是修改了临时变量 number,不会改变原数组 numbers
    }

Java 8+ 的 Stream API

对于更现代的 Java 8 及以上版本,可以使用 Stream API 来遍历数组,这种方式功能非常强大,尤其是在进行数据转换、过滤、聚合等操作时。

语法:

Arrays.stream(数组名).forEach(元素 -> {
    // 对元素进行操作
});

或者更简洁的 Lambda 表达式形式:

Arrays.stream(数组名).forEach(元素 -> System.out.println(元素));

示例代码:

import java.util.Arrays;
public class StreamLoop {
    public static void main(String[] args) {
        // 1. 定义一个整型数组
        int[] scores = {88, 92, 75, 100, 61};
        System.out.println("使用 Java 8 Stream API 遍历数组:");
        // 2. 使用 Stream 遍历
        // Arrays.stream(scores) 将数组转换为一个 IntStream
        // forEach 对流中的每个元素执行指定的操作
        Arrays.stream(scores).forEach(score -> {
            System.out.println("分数: " + score);
        });
        // 更简洁的写法
        System.out.println("\n更简洁的 Stream 写法:");
        Arrays.stream(scores).forEach(score -> System.out.println("分数: " + score));
    }
}

输出:

使用 Java 8 Stream API 遍历数组:
分数: 88
分数: 92
分数: 75
分数: 100
分数: 61
更简洁的 Stream 写法:
分数: 88
分数: 92
分数: 75
分数: 100
分数: 61

优点:

  • 功能强大: 除了遍历,还可以轻松地链式调用其他操作,如 filter() (过滤), map() (转换), reduce() (归约) 等。
  • 代码简洁且表达力强: 对于复杂的集合操作,代码可以非常优雅。

缺点:

  • 性能开销: 对于简单的遍历,Stream 可能比传统 for 循环有轻微的性能开销。
  • 需要 Java 8+ 环境。

总结与如何选择

特性 传统 for 循环 增强型 for 循环 (For-Each) Stream API
可读性 一般
简洁性 一般 高 (对于复杂操作)
获取索引 容易 不支持 不支持 (需额外处理)
修改数组 可以 不支持 不支持 (直接修改)
功能 基本遍历 基本遍历 强大 (过滤、转换、聚合等)
适用场景 需要索引或修改数组时 简单的只读遍历 复杂的数据处理

选择建议:

  1. 当你只需要简单地遍历数组并读取每个元素时优先使用 for-each 循环,它最安全、最简洁。
  2. 当你在遍历过程中需要知道元素的索引,或者需要根据索引修改数组元素时使用传统 for 循环
  3. 当你需要对数组元素进行一系列复杂的操作(如筛选、转换、求和等)时使用 Stream API,它能让你写出更声明式、更易于维护的代码。
分享:
扫描分享到社交APP
上一篇
下一篇