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
| 特点 | while | do-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);
}