Skip to content

while 循环

循环次数未知但结束条件明确的场景。先判断后执行,可能一次都不执行。

基本语法

java
while (条件) {
    // 循环体
}

执行流程:

      ┌──────────────┐
      │    开始      │
      └──────┬───────┘


      ┌──────────────┐
──────│   条件判断   │◀──────┐
│     └──────┬───────┘       │
│            │              │
│            ▼              │
│     ┌──────────────┐      │
│     │  执行循环体   │──────┘
│     └──────────────┘
│            │
│            ▼
│     ┌──────────────┐
└────▶│     结束      │
      └──────────────┘

基础用法

打印 1-10

java
int i = 1;
while (i <= 10) {
    System.out.println(i);
    i++;
}

计算 1-100 的和

java
int sum = 0;
int num = 1;
while (num <= 100) {
    sum += num;
    num++;
}
System.out.println("sum = " + sum);

累加与累乘

java
// 累加:1+2+3+...+n
int n = 10;
int sum = 0;
int i = 1;
while (i <= n) {
    sum += i;
    i++;
}

// 累乘:1*2*3*...*n
long product = 1;
int j = 1;
while (j <= n) {
    product *= j;
    j++;
}

while vs do-while

特点whiledo-while
首次执行可能不执行(条件为 false)必定执行一次
语法结构先判断后执行先执行后判断
java
int i = 10;

// while:条件为 false,一次都不执行
while (i < 10) {
    System.out.println("while");  // 不会执行
}

// do-while:先执行再判断,至少执行一次
do {
    System.out.println("do-while");  // 会执行一次
} while (i < 10);

实战场景

遍历链表

java
class ListNode {
    int val;
    ListNode next;
}

// 遍历链表
ListNode head = createList();
ListNode current = head;
while (current != null) {
    System.out.println(current.val);
    current = current.next;
}

读取文件直到结束

java
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
}

菜单循环

java
Scanner scanner = new Scanner(System.in);
boolean running = true;

while (running) {
    System.out.println("\n=== 菜单 ===");
    System.out.println("1. 查询");
    System.out.println("2. 添加");
    System.out.println("3. 删除");
    System.out.println("0. 退出");
    System.out.print("请选择:");

    int choice = scanner.nextInt();

    switch (choice) {
        case 1: query(); break;
        case 2: add(); break;
        case 3: delete(); break;
        case 0:
            running = false;
            System.out.println("退出系统");
            break;
        default:
            System.out.println("无效选择");
    }
}

循环控制

break - 跳出循环

java
// 找到第一个符合条件的元素
int[] arr = {5, 3, 8, 1, 9};
int target = 8;
int index = -1;

int i = 0;
while (i < arr.length) {
    if (arr[i] == target) {
        index = i;
        break;  // 找到后跳出循环
    }
    i++;
}
System.out.println("找到位置:" + index);

continue - 跳过本次循环

java
// 打印 1-10,跳过偶数
int i = 0;
while (i < 10) {
    i++;
    if (i % 2 == 0) {
        continue;  // 跳过偶数
    }
    System.out.println(i);  // 输出 1, 3, 5, 7, 9
}

使用标签控制外层循环

多层循环中可以用标签指定跳出哪一层。

java
outer:
for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 5; j++) {
        if (i == 2 && j == 2) {
            break outer;  // 跳出外层循环
        }
        System.out.print("(" + i + "," + j + ") ");
    }
    System.out.println();
}

常见问题

死循环

确保条件变量会更新,避免死循环。

java
// ❌ 错误:忘记更新条件变量
int i = 0;
while (i < 10) {
    System.out.println(i);
    // 忘记 i++
}

// ✅ 正确
int i = 0;
while (i < 10) {
    System.out.println(i);
    i++;
}

循环变量未初始化

java
// ❌ 错误
int i;
while (i < 10) {  // 编译错误,i 未初始化
    System.out.println(i);
    i++;
}

// ✅ 正确
int i = 0;
while (i < 10) {
    System.out.println(i);
    i++;
}

最佳实践

循环条件外置

java
// ✅ 循环条件清晰
boolean hasMore = true;
while (hasMore) {
    Object data = fetchData();
    if (data == null) {
        hasMore = false;
    } else {
        process(data);
    }
}

固定次数用 for 循环

已知循环次数时用 for 更清晰。

java
// ✅ 推荐
for (int i = 0; i < list.size(); i++) {
    process(list.get(i));
}

// ❌ 不推荐
int i = 0;
while (i < list.size()) {
    process(list.get(i));
    i++;
}

循环体职责单一

java
// ✅ 职责单一
while (hasMore) {
    Object data = fetchData();
    if (data == null) break;
    validate(data);
    process(data);
    save(data);
}

基于 VitePress 构建