在 Java 中,switch
是一种多分支选择语句,用于根据表达式的值选择不同的代码块执行。相较于多个 if-else
语句,switch
可以使代码更简洁和易读。以下是 switch
的详细说明,涵盖基本语法、使用场景、新特性(如 Java 12+ 的增强)及注意事项。
1. 基本语法
java
switch (expression) { case value1: // 代码块1 break; case value2: // 代码块2 break; // 更多 case... default: // 默认代码块 }
-
expression
表达式可以是以下类型:-
byte
,short
,int
,char
(Java 1.0-1.6) -
String
(Java 7+) -
enum
类型(Java 5+) -
包装类(如
Integer
,Character
等,Java 5+)
-
-
case
每个case
后跟一个常量值,若expression
的值与该常量匹配,则执行对应的代码块。 -
break
用于跳出switch
语句,防止代码继续执行下一个case
(即“穿透”)。 -
default
当所有case
都不匹配时执行,可选。
2. 使用示例
传统写法
java
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(dayType); // 输出:工作日
Java 12+ 新语法
Java 12 引入了更简洁的 switch
表达式(正式发布于 Java 14):
-
使用
->
箭头语法,无需break
。 -
允许直接返回值。
-
支持多值
case
。
java
int day = 3; String dayType = switch (day) { case 1, 2, 3, 4, 5 -> "工作日"; // 多值合并 case 6, 7 -> "周末"; default -> "无效"; }; System.out.println(dayType); // 输出:工作日
3. 关键特性与注意事项
(1) Case 穿透
-
如果
case
后没有break
,代码会继续执行下一个case
的代码块。 -
用途:多个
case
共享同一逻辑时,可省略break
。java
switch (n) { case 1: case 2: System.out.println("1或2"); // case 穿透 break; // ... }
(2) Java 12+ 增强特性
-
箭头语法
->
-
简化代码,无需
break
。 -
右侧可以是表达式、代码块或抛出异常。
java
switch (day) { case 1 -> System.out.println("周一"); case 2 -> { // 代码块 System.out.println("周二"); System.out.println("工作日"); } default -> throw new IllegalArgumentException(); }
-
-
yield
返回值
在代码块中使用yield
返回结果:java
String dayType = switch (day) { case 1, 2, 3, 4, 5 -> "工作日"; case 6, 7 -> { if (day == 6) yield "周六"; else yield "周日"; } default -> "无效"; };
(3) 类型限制
-
case
值必须是编译时常量,且类型与expression
匹配。 -
不允许重复的
case
值。
4. 与 if-else
的对比
场景 | switch | if-else |
---|---|---|
条件类型 | 等值判断(常量匹配) | 范围判断或复杂逻辑 |
可读性 | 多分支时更清晰 | 分支多时可能臃肿 |
性能 | 对常量跳转优化(如跳转表) | 逐条件判断 |
灵活性 | 仅支持有限类型 | 支持所有布尔表达式 |
5. 常见错误
-
忘记
break
导致意外的 case 穿透。 -
default
缺失
未处理未知情况可能引发逻辑错误。 -
类型不匹配
如switch
表达式为String
,但case
用了整型。
6. 最佳实践
-
使用
switch
处理多分支等值判断。 -
Java 12+ 项目中优先使用箭头语法和表达式形式。
-
始终添加
default
分支处理意外情况。
通过合理使用 switch
,可以显著提升代码简洁性和可维护性。