Java 流程控制:从条件判断到循环遍历(核心总结 + 实战要点)
Java 的流程控制语句主要分为三大类:
- 条件判断(选择结构)
- 循环结构(重复执行)
- 跳转语句(控制流程走向)
下面按重要程度和使用频率逐一讲解,附带常见误区和最佳实践。
一、条件判断(选择结构)
1. if 语句(最常用)
// 基本形式
if (条件) {
// 条件为 true 时执行
}
// 带 else
if (条件) {
// true
} else {
// false
}
// 多分支
if (条件1) {
// ...
} else if (条件2) {
// ...
} else if (条件3) {
// ...
} else {
// 都不满足
}
注意事项:
- 条件必须是
boolean类型(不能写if (a = 5)) - 大括号
{}强烈建议始终写上,即使只有一行代码(防止后续维护出错)
经典错误示例(新手高频坑):
int score = 85;
if (score >= 90)
System.out.println("优秀");
System.out.println("恭喜!"); // 这行无条件执行!!!
正确写法:加 {} 或写成一行
2. switch 语句(多分支选择)
JDK 早期版本(经典写法):
int day = 3;
switch (day) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
default:
System.out.println("其他");
break;
}
JDK 12+ 增强版(推荐使用) → switch 表达式(更简洁)
String result = switch (day) {
case 1, 2, 3, 4, 5 -> "工作日";
case 6, 7 -> "周末";
default -> "非法输入";
};
switch 表达式特点:
- 使用
->(箭头语法) - 自动结束(不需要 break)
- 可以直接赋值给变量
- 支持
yield返回值(更复杂情况)
String desc = switch (score / 10) {
case 10, 9 -> "优秀";
case 8 -> "良好";
case 7 -> "中等";
default -> {
yield "不及格"; // 多语句时用 yield
}
};
二、循环结构(重复执行)
1. while 循环(先判断后执行)
int i = 1;
while (i <= 10) {
System.out.println(i);
i++;
}
适用场景:不知道要循环多少次(比如读文件、等待输入)
2. do-while 循环(先执行后判断)
int i = 1;
do {
System.out.println(i);
i++;
} while (i <= 10);
特点:至少执行一次(即使条件一开始就不成立)
经典使用场景:菜单选择系统(先显示菜单再判断用户输入)
3. for 循环(最常用,结构最清晰)
传统 for 循环
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
增强 for 循环(for-each) —— 遍历集合或数组首选
int[] arr = {10, 20, 30, 40};
for (int num : arr) {
System.out.println(num);
}
List<String> names = Arrays.asList("张三", "李四", "王五");
for (String name : names) {
System.out.println(name);
}
for 循环的几种常见写法对比
| 写法 | 适用场景 | 可否修改循环变量 | 推荐指数 |
|---|---|---|---|
for (int i = 0; i < n; i++) | 需要索引、计数、步长控制 | 可以 | ★★★★★ |
for (int i = n-1; i >= 0; i--) | 逆序遍历 | 可以 | ★★★★☆ |
for (元素 : 集合/数组) | 只读遍历,不需要索引 | 不能修改索引 | ★★★★★ |
for(;;) | 死循环(配合 break 使用) | — | ★★★☆☆ |
三、跳转语句(改变正常执行流程)
| 语句 | 作用 | 常用场景 | 注意事项 |
|---|---|---|---|
break | 跳出当前循环(单层) | 提前结束循环 | 可配合标签跳出多层循环 |
continue | 跳过本次循环,进入下一次循环 | 满足条件时跳过本次剩余代码 | 只影响当前循环层 |
return | 结束整个方法,返回结果(或无返回) | 方法提前返回 | 在循环中使用会直接结束方法 |
带标签的 break / continue(少用,但能解决嵌套循环问题)
outer: for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 5; j++) {
if (j == 3) {
break outer; // 直接跳出两层循环
// continue outer; // 跳到外层循环下一轮
}
System.out.println(i + "-" + j);
}
}
四、常见面试 / 易错点速记
if后面不要写分号;if (a > b); { ... }→ 大括号内容无条件执行- switch 漏写 break → case 穿透(有时故意用,有时是 Bug)
- for 循环中修改集合(add/remove) →
ConcurrentModificationException正确做法:
- 用迭代器删除:
iterator.remove() - 收集要删除的元素后统一删除
- 用
for (int i = list.size()-1; i >= 0; i--)逆序删除
- while(true) 死循环忘记 break
- 增强 for 循环中不能修改集合结构
五、快速练习题(建议动手写)
- 用 switch 表达式实现输入 1~12 返回对应月份的英文
- 打印 1~100 内所有 3 的倍数或 5 的倍数(用 continue 跳过不符合的)
- 用嵌套循环打印 9×9 乘法表
- 统计字符串中每个字符出现的次数(用数组或 HashMap)
- 求 1~1000 内所有“水仙花数”(三位数,每位数字立方和等于本身)
如果你想针对某个语句深入讲解(比如 switch 表达式的所有用法、for 循环的性能细节、多层循环的优化等),或者需要某道题的参考答案,可以直接告诉我,我继续展开。