深度理解 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教程 - 廖雪峰的官方网站


相关推荐
没有bug.的程序员2 小时前
服务安全:内部服务如何防止“裸奔”?
java·网络安全·云原生安全·服务安全·零信任架构·微服务安全·内部鉴权
一线大码3 小时前
SpringBoot 3 和 4 的版本新特性和升级要点
java·spring boot·后端
weixin_440730503 小时前
java数组整理笔记
java·开发语言·笔记
weixin_425023003 小时前
Spring Boot 实用核心技巧汇总:日期格式化、线程管控、MCP服务、AOP进阶等
java·spring boot·后端
一线大码3 小时前
Java 8-25 各个版本新特性总结
java·后端
2501_906150563 小时前
私有部署问卷系统操作实战记录-DWSurvey
java·运维·服务器·spring·开源
better_liang3 小时前
每日Java面试场景题知识点之-TCP/IP协议栈与Socket编程
java·tcp/ip·计算机网络·网络编程·socket·面试题
niucloud-admin4 小时前
java服务端——controller控制器
java·开发语言
To Be Clean Coder4 小时前
【Spring源码】通过 Bean 工厂获取 Bean 的过程
java·后端·spring
Fortunate Chen4 小时前
类与对象(下)
java·javascript·jvm