源本科技 | 码上会

Java 循环

2025/12/25
62
0

在编程中,循环(Loops) 是一种控制结构,它允许我们根据特定条件重复执行一段代码。Java 提供了多种循环语句,适用于不同场景。本文将系统讲解 Java 中的三种主要循环类型(包括增强型 for 循环),并通过示例、流程图和常见错误分析,帮助你掌握循环的正确使用方法。


学习目标

  • 理解 Java 中 forwhiledo-while 循环的基本语法与执行流程

  • 掌握增强型 for(for-each)循环的使用场景

  • 能够识别并避免常见的循环陷阱(如无限循环、边界错误等)

  • 根据实际需求选择合适的循环类型


for 循环

适用场景

详情请参考《Java 中的 for 循环

当你明确知道需要重复执行的次数时,应优先使用 for 循环。

语法

for (初始化; 条件; 增量/减量) {
    // 要执行的代码
}

示例:打印 0 到 10 的数字

// Java 程序演示 for 循环
import java.io.*;

class Main {
    public static void main(String[] args) {
        for (int i = 0; i <= 10; i++) {
            System.out.print(i + " ");
        }
    }
}
0 1 2 3 4 5 6 7 8 9 10 

执行流程说明

  1. 初始化:声明并初始化循环变量(如 int i = 0),仅执行一次。

  2. 条件判断:每次循环前检查条件(如 i <= 10),若为 true 则继续,否则退出。

  3. 执行语句:运行循环体内的代码。

  4. 更新变量:执行增量或减量操作(如 i++)。

  5. 重复:回到第 2 步,直到条件为 false

注意for 循环是入口控制循环(Entry-Controlled Loop),即先判断条件再执行。


增强型 for 循环(for-each)

用于遍历数组或集合中的每个元素,无需手动管理索引。

语法

for (数据类型 变量 : 数组或集合) {
    // 处理当前元素
}

示例:遍历字符串数组

// 演示 for-each 循环
import java.io.*;

class Main {
    public static void main(String[] args) {
        String[] names = { "Sweta", "Gudly", "Amiya" };
        
        for (String name : names) {
            System.out.println("Name: " + name);
        }
    }
}

输出

Name: Sweta
Name: Gudly
Name: Amiya

优点:代码简洁、不易出错,特别适合只读遍历。


while 循环

适用场景

详情请参考《Java 中的 while 循环

不确定循环次数,但希望在每次执行前先检查条件时使用。

语法

while (条件) {
    // 要执行的代码
}

示例:打印 0 到 10

import java.io.*;

class Main {
    public static void main(String[] args) {
        int i = 0;
        while (i <= 10) {
            System.out.print(i + " ");
            i++;
        }
    }
}

输出:

0 1 2 3 4 5 6 7 8 9 10 

特点

  • 也是入口控制循环:先判断条件,再决定是否执行。

  • 必须在循环体内更新控制变量,否则可能陷入死循环。


do-while 循环

适用场景

详情请参考《Java 中的 do-while 循环

当你必须确保循环体至少执行一次,无论条件是否满足。

语法

do {
    // 要执行的代码
} while (条件);

示例:打印 0 到 10

import java.io.*;

class Main {
    public static void main(String[] args) {
        int i = 0;
        do {
            System.out.print(i + " ");
            i++;
        } while (i <= 10);
    }
}

输出

0 1 2 3 4 5 6 7 8 9 10 

特点

  • 出口控制循环:先执行一次循环体,再判断条件。

  • 即使初始条件为 false,循环体也会执行一次。


常见循环错误及规避方法

1. 无限循环

原因:循环条件永远为真,导致程序无法终止。

错误示例

for (int i = 0; i < 5; i--) {  // i 不断减小,永远小于 5
    System.out.println("This loop will run forever");
}

后果:程序卡死或触发超时错误(TLE)。

解决方法:确保循环变量朝着使条件为假的方向变化。


2. 边界错误

原因:循环多执行或少执行一次,通常因使用 <=< 混淆导致。

错误示例(期望执行 5 次,实际 6 次):

for (int i = 0; i <= 5; i++) {  // i = 0,1,2,3,4,5 → 共 6 次
    System.out.print(i + " ");
}

建议:明确循环范围,使用半开区间(如 i < n 表示 0 到 n-1)。


3. 在循环体内修改控制变量

问题:可能导致跳过迭代或逻辑混乱。

问题示例:

for (int i = 0; i < 5; i++) {
    if (i == 2) {
        i++;  // 手动增加 i,导致 i=3 被跳过
    }
    System.out.println(i);
}

输出:

0
1
2
4

最佳实践:避免在循环体内直接修改循环变量,除非有充分理由并清晰注释。


4. 空循环体

问题:循环没有实际操作,浪费资源且降低可读性。

示例:

for (int i = 0; i < 10; i++) {
    // 空语句,无任何操作
}

建议:若确实需要空循环(如延时),应添加注释说明意图;否则应删除或重构。


循环类型对比

循环类型

适用场景

条件检查时机

是否至少执行一次?

控制类型

for

已知迭代次数

循环体

入口控制

while

先判断条件再执行

循环体

入口控制

do-while

必须至少执行一次

循环体

出口控制

for-each

遍历数组或集合

内部自动处理

否(若集合为空则不执行)


思考题

  1. 为什么 do-while 循环被称为“出口控制循环”?请结合其执行流程说明。

  2. 在什么情况下你会选择 for-each 循环而不是传统的 for 循环?它有哪些限制?

  3. 分析以下代码是否会陷入无限循环?为什么?

    int x = 10;
    while (x > 0) {
        System.out.println(x);
        x -= 2;
    }