Java 实例 – for 和 foreach循环使用:从入门到精通

在 Java 编程中,循环结构是处理重复任务的核心工具。无论是遍历数组、集合,还是执行固定次数的操作,掌握 for 和 foreach 循环的用法,都意味着你已经迈入了更高效编码的大门。对于初学者来说,这两个循环看似相似,实则各有千秋。本文将通过大量实际代码示例,带你深入理解它们的使用场景、性能差异与最佳实践,帮助你在日常开发中做出更优选择。

for 循环:精准控制的“老将”

for 循环是 Java 中最经典、最灵活的循环结构。它的语法清晰,控制力强,适合需要精确控制循环变量的场景。

// 示例:打印 1 到 10 的数字

for (int i = 1; i <= 10; i++) {

System.out.println("当前数字是:" + i);

}

代码解析:

int i = 1:初始化循环变量 i,从 1 开始。

i <= 10:循环条件,只要 i 小于等于 10,就继续执行。

i++:每次循环结束后,i 自增 1。

System.out.println:输出当前 i 的值。

这个结构就像开车时的油门和刹车,你可以精确控制“何时出发”、“何时停止”、“每一步走多远”。

for 循环的典型应用场景

遍历数组下标:当你需要根据索引访问数组元素时,for 循环是首选。

执行固定次数的任务:比如循环 100 次执行某个操作。

反向遍历:从数组末尾向前遍历。

// 反向遍历数组

String[] names = {"张三", "李四", "王五", "赵六"};

for (int i = names.length - 1; i >= 0; i--) {

System.out.println("倒序输出:" + names[i]);

}

关键点:names.length - 1 是为了避免下标越界,因为数组下标从 0 开始。

foreach 循环:简洁优雅的“新秀”

foreach 循环(也叫增强 for 循环)是 Java 5 引入的语法糖,它的设计初衷是简化集合和数组的遍历过程,让代码更清晰、更易读。

// 示例:遍历字符串数组

String[] fruits = {"苹果", "香蕉", "橙子", "葡萄"};

for (String fruit : fruits) {

System.out.println("水果:" + fruit);

}

代码解析:

String fruit:声明一个局部变量,用于接收当前元素。

: fruits:冒号连接,表示“从 fruits 中取出每个元素”。

fruit 会依次获取数组中的每一个值。

这个写法就像在超市里挑选商品:你不需要记住编号,只需要说“我要一个一个拿”,系统会自动帮你完成。

foreach 的优势与适用范围

语法简洁:无需管理下标,避免出错。

安全性高:不会出现下标越界问题。

适用于所有实现了 Iterable 接口的集合:如 List、Set、Map(通过 entrySet)等。

// 遍历 List 集合

import java.util.ArrayList;

import java.util.List;

List cities = new ArrayList<>();

cities.add("北京");

cities.add("上海");

cities.add("广州");

cities.add("深圳");

for (String city : cities) {

System.out.println("城市:" + city);

}

注意:foreach 循环无法直接获取当前索引,如果需要索引,仍需使用 for 循环。

for 与 foreach 的对比:选哪个更合适?

特性

for 循环

foreach 循环

是否需要索引

✅ 需要

❌ 不支持

是否可修改集合元素

✅ 可以(通过下标)

❌ 不推荐,可能抛出 ConcurrentModificationException

性能表现

极高,无额外开销

稍微高一点,因为内部有迭代器调用

代码可读性

一般

适用场景

精确控制、反向遍历、修改元素

简单遍历、只读操作

小贴士:如果你只是“读取”数据,不修改,也不关心索引,优先使用 foreach。如果需要修改元素或控制流程,for 循环更合适。

实战案例:处理学生分数统计

假设我们有一个学生分数列表,需要完成以下任务:

打印所有分数

统计平均分

找出最高分和最低分

import java.util.Arrays;

import java.util.List;

public class StudentScoreExample {

public static void main(String[] args) {

// 存储学生成绩

List scores = Arrays.asList(85.5, 92.0, 78.5, 96.0, 88.0, 73.5, 91.0);

// 1. 使用 foreach 打印所有分数

System.out.println("=== 所有学生成绩 ===");

for (Double score : scores) {

System.out.println("分数:" + score);

}

// 2. 使用 for 循环计算平均分(需要索引)

double sum = 0.0;

for (int i = 0; i < scores.size(); i++) {

sum += scores.get(i);

}

double average = sum / scores.size();

System.out.println("平均分:" + average);

// 3. 使用 foreach 找出最高分

double maxScore = scores.get(0); // 初始值设为第一个元素

for (Double score : scores) {

if (score > maxScore) {

maxScore = score;

}

}

System.out.println("最高分:" + maxScore);

// 4. 使用 for 循环找出最低分(演示索引控制)

double minScore = scores.get(0);

for (int i = 1; i < scores.size(); i++) {

if (scores.get(i) < minScore) {

minScore = scores.get(i);

}

}

System.out.println("最低分:" + minScore);

}

}

运行结果:

=== 所有学生成绩 ===

分数:85.5

分数:92.0

分数:78.5

分数:96.0

分数:88.0

分数:73.5

分数:91.0

平均分:87.14285714285714

最高分:96.0

最低分:73.5

案例分析:

foreach 用于打印和找最大值,代码简洁。

for 循环用于计算平均分和找最小值,因为需要索引或更精细控制。

常见误区与避坑指南

在 foreach 中修改集合:

如果你在 foreach 循环中调用 list.remove(),会抛出 ConcurrentModificationException。

解决方案:使用迭代器(Iterator)或转为 for 循环。

foreach 无法获取索引:

如果你需要知道当前是第几个元素,必须使用 for 循环。

性能误区:

有些人认为 foreach 性能差,其实两者在大多数情况下差异极小。优先选择可读性高的写法。

for 循环变量作用域:

for (int i = 0; i < 10; i++) 中的 i 只在循环体内有效,外部无法访问。

总结与建议

在 Java 实例 – for 和 foreach循环使用 的实践中,我们发现:

for 循环是“控制大师”,适合需要索引、修改元素或反向遍历的场景。

foreach 循环是“优雅写手”,适合只读遍历、提升代码可读性。

两者不是替代关系,而是互补关系。在实际项目中,应根据需求灵活选择。记住:代码不是越短越好,而是越清晰、越安全越好。

掌握这两个循环,你就拥有了处理数据的“双刃剑”。无论你是初学者还是中级开发者,持续练习这些基础语法,才能在复杂项目中游刃有余。

下一次写代码时,不妨问问自己:我需要控制索引吗?我是否要修改集合?答案决定了你该用哪一个循环。多写、多试、多思考,才是进步的捷径。