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

语法:
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]);
}
}
}
输出:

使用传统 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 等),它隐藏了索引的细节,让你专注于元素本身。
语法:

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 |
|---|---|---|---|
| 可读性 | 一般 | 高 | 高 |
| 简洁性 | 一般 | 高 | 高 (对于复杂操作) |
| 获取索引 | 容易 | 不支持 | 不支持 (需额外处理) |
| 修改数组 | 可以 | 不支持 | 不支持 (直接修改) |
| 功能 | 基本遍历 | 基本遍历 | 强大 (过滤、转换、聚合等) |
| 适用场景 | 需要索引或修改数组时 | 简单的只读遍历 | 复杂的数据处理 |
选择建议:
- 当你只需要简单地遍历数组并读取每个元素时,优先使用
for-each循环,它最安全、最简洁。 - 当你在遍历过程中需要知道元素的索引,或者需要根据索引修改数组元素时,使用传统
for循环。 - 当你需要对数组元素进行一系列复杂的操作(如筛选、转换、求和等)时,使用
StreamAPI,它能让你写出更声明式、更易于维护的代码。
