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


相关推荐
camellias_4 小时前
【无标题】
java·tomcat
咸鱼2.04 小时前
【java入门到放弃】需要背诵
java·开发语言
椰猫子5 小时前
Java:异常(exception)
java·开发语言
win x6 小时前
Redis 使用~如何在Java中连接使用redis
java·数据库·redis
星晨雪海6 小时前
基于 @Resource 的支付 Service 多实现类完整示例
java·开发语言
阿维的博客日记6 小时前
什么是逃逸分析
java·juc
Ricky_Theseus6 小时前
C++右值引用
java·开发语言·c++
Rick19937 小时前
Java内存参数解析
java·开发语言·jvm
我是大猴子7 小时前
Spring代理类为何依赖注入失效?
java·后端·spring
勿忘,瞬间7 小时前
多线程之进阶修炼
java·开发语言