Java 循环结构(for / while)
循环语句用于重复执行代码块。Java 提供了 for、while、do-while 三种循环结构,以及增强的 for 循环。理解循环的使用是编写高效程序的基础。
for 循环、增强 for 循环
for 循环
语法:
for (初始化; 条件; 更新) {
// 循环体
}
执行流程:
- 执行初始化语句
- 检查条件,如果为 false,退出循环
- 执行循环体
- 执行更新语句
- 回到步骤 2
示例:
// 打印 1 到 10
for (int i = 1; i <= 10; i++) {
System.out.println(i);
}
详细分析:
for (int i = 1; // 初始化:i = 1
i <= 10; // 条件:i <= 10
i++) { // 更新:i 自增
System.out.println(i);
}
for 循环的变体
1. 多个变量
for (int i = 0, j = 10; i < j; i++, j--) {
System.out.println("i = " + i + ", j = " + j);
}
2. 省略初始化(变量已声明)
int i = 0;
for (; i < 10; i++) {
System.out.println(i);
}
3. 省略更新(在循环体中更新)
for (int i = 0; i < 10; ) {
System.out.println(i);
i += 2; // 在循环体中更新
}
4. 无限循环
for (;;) {
// 无限循环
// 需要在循环体内使用 break 退出
if (条件) {
break;
}
}
增强 for 循环(for-each)
语法:
for (元素类型 变量 : 集合或数组) {
// 循环体
}
示例:
// 遍历数组
int[] numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
System.out.println(num);
}
// 遍历集合
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
for (String name : names) {
System.out.println(name);
}
特点:
- 语法简洁
- 自动处理索引
- 只读访问(不能修改元素)
- 适用于数组和实现了
Iterable接口的集合
限制:
- 不能获取索引
- 不能修改数组元素
- 不能反向遍历
int[] arr = {1, 2, 3};
// 增强 for 循环不能修改元素
for (int num : arr) {
num = num * 2; // 只修改了局部变量,不影响数组
}
// 需要使用传统 for 循环修改
for (int i = 0; i < arr.length; i++) {
arr[i] = arr[i] * 2; // 修改数组元素
}
while / do-while 循环
while 循环
语法:
while (条件) {
// 循环体
}
执行流程:
- 检查条件
- 如果为 true,执行循环体
- 回到步骤 1
示例:
int i = 1;
while (i <= 10) {
System.out.println(i);
i++;
}
特点:
- 先判断条件,再执行循环体
- 可能一次都不执行(条件初始为 false)
do-while 循环
语法:
do {
// 循环体
} while (条件);
执行流程:
- 执行循环体
- 检查条件
- 如果为 true,回到步骤 1
示例:
int i = 1;
do {
System.out.println(i);
i++;
} while (i <= 10);
特点:
- 先执行循环体,再判断条件
- 至少执行一次
对比:
int i = 10;
// while:不执行
while (i < 10) {
System.out.println(i);
i++;
}
// do-while:执行一次
do {
System.out.println(i); // 输出 10
i++;
} while (i < 10);
break 与 continue
break 语句
作用:立即退出循环
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break; // 退出循环
}
System.out.println(i);
}
// 输出:1, 2, 3, 4
跳出多层循环:使用标签
outer: for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == 1 && j == 1) {
break outer; // 跳出外层循环
}
System.out.println("i = " + i + ", j = " + j);
}
}
continue 语句
作用:跳过本次循环,继续下一次循环
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
System.out.println(i);
}
// 输出:1, 3, 5, 7, 9
跳过多层循环:使用标签
outer: for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (j == 1) {
continue outer; // 跳过外层循环的本次迭代
}
System.out.println("i = " + i + ", j = " + j);
}
}
break vs continue
| 语句 | 作用 | 示例 |
|---|---|---|
| break | 退出整个循环 | 找到目标后退出 |
| continue | 跳过本次迭代 | 跳过某些值,继续循环 |
// break:找到第一个偶数就退出
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
System.out.println("找到偶数:" + i);
break; // 退出循环
}
}
// continue:跳过所有奇数
for (int i = 1; i <= 10; i++) {
if (i % 2 != 0) {
continue; // 跳过奇数
}
System.out.println("偶数:" + i);
}
循环嵌套示例
示例 1:打印乘法表
public class MultiplicationTable {
public static void main(String[] args) {
// 外层循环:控制行
for (int i = 1; i <= 9; i++) {
// 内层循环:控制列
for (int j = 1; j <= i; j++) {
System.out.print(j + " × " + i + " = " + (i * j) + "\t");
}
System.out.println(); // 换行
}
}
}
输出:
1 × 1 = 1
1 × 2 = 2 2 × 2 = 4
1 × 3 = 3 2 × 3 = 6 3 × 3 = 9
...
示例 2:查找二维数组
public class FindInMatrix {
public static void main(String[] args) {
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int target = 5;
boolean found = false;
// 使用标签跳出嵌套循环
outer: for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
if (matrix[i][j] == target) {
System.out.println("找到 " + target + " 在位置 [" + i + "][" + j + "]");
found = true;
break outer; // 跳出外层循环
}
}
}
if (!found) {
System.out.println("未找到 " + target);
}
}
}
示例 3:打印图案
public class Pattern {
public static void main(String[] args) {
int n = 5;
// 打印三角形
for (int i = 1; i <= n; i++) {
// 打印空格
for (int j = 1; j <= n - i; j++) {
System.out.print(" ");
}
// 打印星号
for (int j = 1; j <= 2 * i - 1; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
输出:
*
***
*****
*******
*********