
文章目录
-
- [一、switch 的基本语法](#一、switch 的基本语法)
- [二、switch 支持的数据类型](#二、switch 支持的数据类型)
- 三、经典示例:数字判断
- [四、没有 `break` 会发生什么?(Fall-through)](#四、没有
break会发生什么?(Fall-through)) - [五、switch 支持 `String`(Java 7+)](#五、switch 支持
String(Java 7+)) - [六、switch + enum(推荐!)](#六、switch + enum(推荐!))
- [七、Java 14+ 的增强型 `switch`(更简洁更强大)](#七、Java 14+ 的增强型
switch(更简洁更强大)) -
- [🔥 写法一:箭头语法(无 Fall-through)](#🔥 写法一:箭头语法(无 Fall-through))
- [🔥 写法二:switch 变成表达式 ------ 可以返回值!](#🔥 写法二:switch 变成表达式 —— 可以返回值!)
- [八、多个 case 合并(传统写法 vs 新写法)](#八、多个 case 合并(传统写法 vs 新写法))
- 九、注意事项(面试必问)
- [十、switch 与 if-else 何时选哪个?](#十、switch 与 if-else 何时选哪个?)
一、switch 的基本语法
java
switch (表达式) {
case 常量1:
// 代码块1
break;
case 常量2:
// 代码块2
break;
default:
// 默认代码块
}
✔ 关键点说明
表达式必须是某种可比较的值。case必须是常量(编译期确定)。break用来阻止继续执行"贯穿"(fall-through)。
二、switch 支持的数据类型
| Java 版本 | 支持类型 |
|---|---|
| Java 7 之前 | byte、short、int、char,以及对应的包装类 |
| Java 7 | 增加支持 String |
| Java 5 | 允许 enum |
| Java 14+ | 增强型 switch,支持表达式写法 |
三、经典示例:数字判断
java
int day = 3;
switch (day) {
case 1:
System.out.println("Monday");
break;
case 2:
System.out.println("Tuesday");
break;
case 3:
System.out.println("Wednesday");
break;
default:
System.out.println("Unknown Day");
}
四、没有 break 会发生什么?(Fall-through)
如果不写 break,会出现多个 case 连续执行:
java
int num = 1;
switch (num) {
case 1:
System.out.println("A");
case 2:
System.out.println("B");
case 3:
System.out.println("C");
}
运行结果:
plain
A
B
C
⚠ 因为从 case1 开始,不断"贯穿"执行后续 case。
五、switch 支持 String(Java 7+)
java
String cmd = "start";
switch (cmd) {
case "start":
System.out.println("Start command");
break;
case "stop":
System.out.println("Stop command");
break;
default:
System.out.println("Unknown command");
}
底层使用
String.hashCode()和equals判断。
六、switch + enum(推荐!)
在实际项目中对枚举使用 switch 非常规范,且可读性最佳。
java
enum Level { LOW, MEDIUM, HIGH }
Level level = Level.MEDIUM;
switch (level) {
case LOW:
System.out.println("Low Level");
break;
case MEDIUM:
System.out.println("Medium Level");
break;
case HIGH:
System.out.println("High Level");
break;
}
七、Java 14+ 的增强型 switch(更简洁更强大)
🔥 写法一:箭头语法(无 Fall-through)
java
switch (day) {
case 1 -> System.out.println("Monday");
case 2 -> System.out.println("Tuesday");
default -> System.out.println("Unknown");
}
- 不需要
break - 不会出现贯穿现象
🔥 写法二:switch 变成表达式 ------ 可以返回值!
java
String type = switch (day) {
case 1 -> "Monday";
case 2 -> "Tuesday";
default -> "Unknown";
};
或 Block 形式:
java
String msg = switch (day) {
case 1, 2 -> "Workday";
case 6, 7 -> "Weekend";
default -> {
yield "Undefined";
}
};
📌 新特性亮点
- switch 语句 → 表达式
- 箭头写法更简洁
- 可直接返回值
- 不会误触发 fall-through
八、多个 case 合并(传统写法 vs 新写法)
传统写法:
java
case 1:
case 2:
case 3:
System.out.println("1~3");
break;
Java 14+ 写法:
java
case 1, 2, 3 -> System.out.println("1~3");
更清晰、更安全。
九、注意事项(面试必问)
1. case 后必须是"编译期常量"
java
final int a = 1; // 可以
case a:
2. default 不一定要写,但推荐写
3. switch 表达式必须覆盖所有可能枚举值,否则编译报错(在使用表达式时)
4. 不同类型不能混用:
java
switch("abc") { case 1: } // ❌ 错误
5. null 会导致 NPE(特别是 String)
十、switch 与 if-else 何时选哪个?
| 场景 | 推荐 |
|---|---|
| 多值枚举、固定常量分支 | switch |
| 多条件范围判断(如 >, <, >=) | if-else |
| 逻辑条件复杂 | if-else |
| 简单值判断,分支多 | switch 更清晰 |
记住以下重点:
switch适合"值匹配"String和enum非常适合与 switch 搭配- Java 14+ 的增强 switch 支持"箭头语法"和"表达式"
- 表达式形式可直接返回值
- fall-through 是传统 switch 的坑,要注意
break
参考资料
switch多重选择 - Java教程 - 廖雪峰的官方网站