Java 循环结构
循环结构(Looping structures)是 Java(以及几乎所有编程语言)中最基础、最核心的控制流机制之一。它允许你重复执行一段代码块,只要你设定的特定条件依然为真(true)。
理解并熟练运用循环,对于自动化重复性任务、处理海量数据集合以及创建动态交互式程序相当重要。如果没有循环,为了执行同样的操作 100 次,你就不得不把相同的代码复制粘贴 100 遍——这会让你的程序变得无比冗长、极其低效且根本无法维护。
本章我们将深入探讨 Java 中的三大循环神兵:for、while 和 do-while。
1. for 循环:精准控制次数的利器
for 循环是一种强大且极其灵活的循环结构。当你在执行前就已经明确知道代码需要重复多少次时,它是最完美的选择。它巧妙地将“初始化计数器”、“判断是否继续的条件”以及“更新计数器”这三个核心要素集中在了一行代码中,极其简洁。
1.1 for 循环的语法
for 循环的标准语法如下:
for (初始化; 条件判断; 步进/更新) {
// 需要被重复执行的代码块
}让我们把 for 循环拆解开来:
- 初始化 (Initialization): 这部分只在循环开始前执行一次。它通常用来声明并初始化一个计数器变量。例如:
int i = 0; - 条件判断 (Condition): 这是一个布尔表达式,在每次循环迭代之前都会被评估。如果条件为
true,则执行循环体内的代码。如果为false,循环立即终止。例如:i < 10; - 步进/更新 (Increment/Decrement): 这部分在每次循环体代码执行完毕之后运行。它通常用于更新(递增或递减)计数器变量。例如:
i++或i--。
1.2 实战演练
示例 1:打印数字 1 到 10
public class ForLoopExample {
public static void main(String[] args) {
// 1. 初始化 i 为 1
// 2. 只要 i <= 10,就继续循环
// 3. 每次循环结束后,将 i 的值加 1 (i++)
for (int i = 1; i <= 10; i++) {
System.out.println(i); // 打印当前 i 的值
}
}
}示例 2:倒序循环 (递减)
public class ForLoopDecrementExample {
public static void main(String[] args) {
// 从 10 开始,只要 i >= 1 就继续,每次循环后 i 减 1 (i--)
for (int i = 10; i >= 1; i--) {
System.out.println("倒计时: " + i);
}
}
}1.3 增强型 for 循环 (for-each 循环)
Java 还提供了一种“增强型 for 循环”(俗称 for-each 循环),它专门用于极度简化数组 (Arrays) 或集合 (Collections) 的遍历操作。
语法:
for (数据类型 变量名 : 数组或集合) {
// 针对每个元素执行的代码
}示例:遍历数组
public class EnhancedForLoopExample {
public static void main(String[] args) {
int[] numbers = {10, 20, 30, 40, 50};
// 读法:"对于 numbers 数组中的每一个 int 类型的 number..."
// 循环会自动把数组里的值依次赋给 'number' 变量
for (int number : numbers) {
System.out.println("元素值: " + number);
}
}
}注:这种写法比传统的 for (int i = 0; i < numbers.length; i++) 更加优雅,且彻底杜绝了“数组越界”的风险。2. while 循环:未知次数的持续探索
while 循环是另一种基础循环。只要你设定的条件为 true,它就会一直重复执行代码块。与 for 循环不同,while 循环没有内置的初始化和步进机制,你必须自己在循环外部初始化变量,并在循环体内部手动更新它。
2.1 while 循环的语法
while (条件判断) {
// 需要被重复执行的代码块
}2.2 实战演练
示例 1:打印数字 1 到 5
public class WhileLoopExample {
public static void main(String[] args) {
int i = 1; // 1. 手动初始化计数器
while (i <= 5) { // 2. 条件判断
System.out.println(i);
i++; // 3. 极其重要:手动更新计数器!如果不加这句,程序将陷入死循环!
}
}
}示例 2:互动式程序 (持续读取输入)
while 循环极其适合用于“不知道到底要循环多少次”的场景,比如等待用户的特定输入。
import java.util.Scanner;
public class WhileLoopInputExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int number = 0;
// 只要用户输入的不是 -1,循环就一直继续
while (number != -1) {
System.out.print("请输入一个数字 (输入 -1 退出): ");
number = scanner.nextInt();
if (number != -1) {
System.out.println("你输入了: " + number);
}
}
System.out.println("程序正在退出...");
scanner.close();
}
}3. do-while 循环:先斩后奏,至少执行一次
do-while 循环与 while 循环非常相似,但有一个极其关键的区别:它的条件判断是在循环体执行完毕之后才进行的。这意味着,无论初始条件是真还是假,do-while 循环的代码块都保证至少会被执行一次。
3.1 do-while 循环的语法
do {
// 需要被重复执行的代码块 (至少执行一次)
} while (条件判断); // 注意:这里必须以分号 ; 结尾!3.2 实战演练
示例:极佳的用户输入校验方案
do-while 是做“输入校验”和“菜单显示”的完美工具,因为你总需要先让用户输入一次(或先看一次菜单),然后再去检查输入是否合法。
import java.util.Scanner;
public class DoWhileLoopInputValidation {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int age;
// 先要求输入,再去检查。如果不合法,就一直循环要求重新输入。
do {
System.out.print("请输入您的年龄 (0-120): ");
age = scanner.nextInt();
if (age < 0 || age > 120) {
System.out.println("年龄不合法,请重新输入!");
}
} while (age < 0 || age > 120); // 如果输入依然不合法,继续循环
System.out.println("校验通过,您输入的合法年龄是: " + age);
scanner.close();
}
}4. 指南:我该选择哪种循环?
虽然很多时候这三种循环可以互相替换实现相同的功能,但在特定的场景下,选择最合适的那一个会让你的代码更加优雅和易读:
for循环: 绝对的首选,当你明确知道循环的次数时(例如:“打印 10 次”、“遍历这个有 5 个元素的数组”)。while循环: 当你不知道具体要循环多少次,但知道循环停止的条件时。特别适合依赖外部因素或用户实时输入的场景(例如:“一直读取文件直到末尾”、“一直循环直到用户点击退出”)。do-while循环: 当你无论如何都必须先让代码执行一次,然后再根据情况决定是否继续时。最典型的场景就是“展示控制台菜单”和“强制用户重新输入合法数据”。