深度理解 Java 中的 switch —— 从基础到进阶的完整指南


文章目录

    • [一、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 之前 byteshortintchar,以及对应的包装类
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 适合"值匹配"
  • Stringenum 非常适合与 switch 搭配
  • Java 14+ 的增强 switch 支持"箭头语法"和"表达式"
  • 表达式形式可直接返回值
  • fall-through 是传统 switch 的坑,要注意 break

参考资料

Java switch case 语句 | 菜鸟教程

switch多重选择 - Java教程 - 廖雪峰的官方网站


相关推荐
__万波__1 小时前
二十三种设计模式(十)--外观模式
java·设计模式·外观模式
今天你TLE了吗1 小时前
Java:基于注解实现去重表消息防止重复消费
java·spring boot·分布式·spring cloud·幂等
没有bug.的程序员1 小时前
大规模微服务下的 JVM 调优实战指南
java·jvm·spring·wpf·延迟
北友舰长1 小时前
基于Springboot+vue大型商场应急预案管理系统的设计与实现【Java毕业设计·安装调试·代码讲解·文档报告】
java·vue.js·spring boot·mysql·商场·应急处理·应急
赵庆明老师1 小时前
在ASP.NET Core Web Api中添加身份验证和授权
java·前端·asp.net
菜鸟小九1 小时前
redis基础(java客户端)
java·redis·bootstrap
七宝大爷1 小时前
第一个CUDA程序:从向量加法开始
android·java·开发语言
__万波__1 小时前
二十三种设计模式(十一)--享元模式
java·设计模式·享元模式
有什么东东1 小时前
redis实现店铺类型查看
java·开发语言·redis