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


相关推荐
桦说编程40 分钟前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅2 小时前
Java面向对象入门(类与对象,新手秒懂)
java
初次攀爬者3 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺3 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart5 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
NE_STOP6 小时前
MyBatis-mybatis入门与增删改查
java
孟陬9 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
想用offer打牌9 小时前
一站式了解四种限流算法
java·后端·go
华仔啊9 小时前
Java 开发千万别给布尔变量加 is 前缀!很容易背锅
java