💡 摘要:你是否曾在编写复杂逻辑时感到代码混乱不堪?是否对for
循环和while
循环的选择犹豫不决?
别担心,流程控制是构建程序逻辑的骨架,掌握它就能让代码变得清晰有序。
本文将带你从最基础的条件语句(if-else, switch)讲起,通过实战案例理解各种条件结构的适用场景。
接着深入循环结构(for, while, do-while),剖析它们的执行流程和性能差异,亲手编写循环解决实际问题。
最后探索循环控制关键字(break, continue)的高级用法和标签机制。从基础语法到实战技巧,从常见陷阱到性能优化,让你真正掌握程序执行的流向控制。文末附面试高频问题解析,助你写出更优雅、高效的代码。
一、程序的方向盘:条件语句
定义:条件语句让程序能够根据不同情况执行不同的代码块,实现分支逻辑。就像开车遇到路口需要选择方向一样。
1. if-else 语句:最基础的条件判断
语法结构:
java
if (条件表达式1) {
// 条件1为true时执行
} else if (条件表达式2) {
// 条件2为true时执行
} else {
// 以上条件都不满足时执行
}
🌰 实战案例:成绩等级评定
java
public class GradeEvaluator {
public static void main(String[] args) {
int score = 85;
String grade;
if (score >= 90) {
grade = "A";
} else if (score >= 80) {
grade = "B"; // 执行这里
} else if (score >= 70) {
grade = "C";
} else if (score >= 60) {
grade = "D";
} else {
grade = "F";
}
System.out.println("得分:" + score + ",等级:" + grade);
// 输出:得分:85,等级:B
}
}
⚠️ 常见陷阱:
java
int x = 10;
if (x > 5); // 注意这里的分号!会导致if语句提前结束
{
System.out.println("x大于5"); // 这行代码总会执行,与if无关
}
2. switch 语句:多路分支选择
语法结构:
java
switch (表达式) {
case 值1:
// 代码块1
break;
case 值2:
// 代码块2
break;
default:
// 默认代码块
}
🌰 实战案例:星期几判断
java
public class WeekdayChecker {
public static void main(String[] args) {
int day = 3;
String dayType;
switch (day) {
case 1:
case 2:
case 3:
case 4:
case 5:
dayType = "工作日";
break;
case 6:
case 7:
dayType = "周末";
break;
default:
dayType = "无效日期";
}
System.out.println("星期" + day + "是:" + dayType);
// 输出:星期3是:工作日
}
}
🆕 Java 12+ 增强switch表达式:
java
// 传统switch
String dayType = "";
switch (day) {
case 1, 2, 3, 4, 5 -> dayType = "工作日";
case 6, 7 -> dayType = "周末";
default -> dayType = "无效";
}
// 更简洁的表达式形式(Java 14+)
String dayType = switch (day) {
case 1, 2, 3, 4, 5 -> "工作日";
case 6, 7 -> "周末";
default -> "无效";
};
二、程序的发动机:循环结构
1. for 循环:已知循环次数时使用
语法结构:
java
for (初始化; 循环条件; 迭代语句) {
// 循环体
}
🌰 实战案例:计算阶乘
java
public class FactorialCalculator {
public static void main(String[] args) {
int n = 5;
long result = 1;
for (int i = 1; i <= n; i++) {
result *= i;
System.out.println(i + "! = " + result);
}
// 输出:
// 1! = 1
// 2! = 2
// 3! = 6
// 4! = 24
// 5! = 120
}
}
🔁 增强for循环(foreach):
java
int[] numbers = {1, 2, 3, 4, 5};
int sum = 0;
for (int num : numbers) {
sum += num;
}
System.out.println("总和:" + sum); // 输出:总和:15
2. while 循环:未知循环次数时使用
语法结构:
java
while (循环条件) {
// 循环体
}
🌰 实战案例:猜数字游戏
java
import java.util.Random;
import java.util.Scanner;
public class GuessNumber {
public static void main(String[] args) {
Random random = new Random();
int target = random.nextInt(100) + 1;
Scanner scanner = new Scanner(System.in);
int guess;
int attempts = 0;
System.out.println("猜一个1-100之间的数字:");
while (true) {
guess = scanner.nextInt();
attempts++;
if (guess == target) {
System.out.println("恭喜!第" + attempts + "次猜对了!");
break;
} else if (guess < target) {
System.out.println("猜小了,再试一次:");
} else {
System.out.println("猜大了,再试一次:");
}
}
scanner.close();
}
}
3. do-while 循环:至少执行一次
语法结构:
java
do {
// 循环体
} while (循环条件);
🌰 实战案例:用户菜单选择
java
import java.util.Scanner;
public class MenuSystem {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int choice;
do {
System.out.println("\n=== 菜单 ===");
System.out.println("1. 开始游戏");
System.out.println("2. 设置");
System.out.println("3. 退出");
System.out.print("请选择:");
choice = scanner.nextInt();
switch (choice) {
case 1:
System.out.println("游戏开始...");
break;
case 2:
System.out.println("进入设置...");
break;
case 3:
System.out.println("再见!");
break;
default:
System.out.println("无效选择!");
}
} while (choice != 3); // 直到选择退出
scanner.close();
}
}
三、循环控制:break, continue, 标签
1. break:立即退出当前循环
java
for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // 当i等于5时退出循环
}
System.out.println(i); // 输出:0,1,2,3,4
}
2. continue:跳过本次循环剩余代码
java
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
System.out.println(i); // 输出:1,3,5,7,9
}
3. 标签:控制外层循环
java
outerLoop: // 标签
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i * j == 4) {
break outerLoop; // 直接跳出外层循环
}
System.out.println(i + " * " + j + " = " + (i * j));
}
}
四、总结:选择合适的结构
- 条件选择:
- 简单分支用
if-else
- 多路分支用
switch
(特别是枚举或固定值)
- 循环选择:
- 已知次数用
for
- 未知次数用
while
- 至少执行一次用
do-while
- 遍历集合用
foreach
- 性能注意:
- 避免在循环内创建不必要的对象
- 复杂条件判断提到循环外部
- 大数据量时考虑算法时间复杂度
🚀 流程控制是编程的基础,合理运用各种结构能让代码更清晰、更高效。
五、面试高频问题
❓1. break、continue、return的区别?
答:
break
:跳出当前循环或switch语句continue
:跳过本次循环,继续下一次return
:结束当前方法,返回结果
❓2. for循环和while循环如何选择?
答:
- 循环次数明确时用
for
循环 - 循环次数不明确,依赖某个条件时用
while
循环 for
循环的循环变量在循环结束后不可访问(作用域限定)
❓3. switch语句支持哪些数据类型?
答:支持byte
、short
、int
、char
、String
、enum
,从Java 7开始支持String,Java 5开始支持enum。
❓4. 什么是无限循环?如何创建?
答:无限循环是永远不会自行结束的循环。
java
// 三种创建方式
while (true) { /* ... */ }
for (;;) { /* ... */ }
do { /* ... */ } while (true);
❓5. 如何优化循环性能?
答:
- 将不变的计算移到循环外
- 避免在循环内调用耗时方法
- 使用增强for循环遍历集合
- 大数据量时考虑算法优化(降低时间复杂度)