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


相关推荐
2301_803538956 分钟前
Java读取Word图片的两种实用方法
java·开发语言·word
C+-C资深大佬24 分钟前
SSM 框架(Spring + SpringMVC + MyBatis)
java·spring·mybatis
帅次43 分钟前
Android 17 开发者实战:核心更新与应用场景落地指南
android·java·ios·android studio·iphone·android jetpack·webview
Ramble_Naylor1 小时前
东方通(TongWeb)SpringBoot开发指导
java·spring boot
大鹏说大话1 小时前
SQL 排序与分组实战:解决“分组后取最新数据“
android·java·数据库
云烟成雨TD1 小时前
Spring AI Alibaba 1.x 系列【64】 ReactAgent 长期记忆
java·人工智能·spring
quan26311 小时前
20260529,日常开发-数据库主从问题
java·mysql·主从·延迟
JacksonMx2 小时前
@Transactional 最佳实践
java·spring boot·spring·性能优化
Sincerelyplz2 小时前
【AI会议纪要实践】mapReduce、RAG 与结构化输出
java·后端·agent
过期动态2 小时前
【LeetCode 热题 100】接雨水
java·数据结构·算法·leetcode·职场和发展