java switch支持byte、short、char、int及包装类(java 5)、string和enum(java 7)、sealed类(java 21),不支持long、float、double、boolean及自定义class;底层统一转为int跳转表匹配。

Java 中 switch 语句处理多分支选择,核心是用一个表达式值去匹配多个固定常量,从而跳转执行对应逻辑。它比一连串 if-else 更简洁、可读性更强,也更利于编译器优化。但要注意版本差异和常见陷阱。
支持哪些类型?从 int 到 String 再到 sealed 类
switch 表达式支持的类型随 Java 版本逐步扩展:
- 基础类型:byte、short、char、int(long 不支持)
- 包装类:Byte、Short、Character、Integer(自动拆箱)
- 枚举:case Status.ACTIVE: ✅ 类型安全,IDE 可补全
- String:Java 7+ 支持,底层调用 equals() 比较内容,不是引用
- sealed 类 + 模式匹配:Java 21+ 可结合 case 做结构化匹配(如 case Person(String name) -> ...)
case 标签必须是编译期常量
每个 case 后面的值不能是运行时才能确定的东西:
- ✅ 允许:字面量("start"、100)、static final 基本类型或字符串(注意:final int MAX = 5; case MAX: ✅,但 case MAX + 1: ❌)
- ❌ 禁止:普通变量、方法调用(case getValue():)、表达式(case x * 2:)、null(老版本中 case null: 编译不通过)
避免 fall-through:用箭头表达式代替传统写法
传统 switch 语句漏写 break 就会穿透执行后续所有 case,极易出错。Java 14+ 推荐使用 switch 表达式(带 ->):
- 每个分支自动终止,无需 break
- 必须覆盖所有可能取值(或有 default),否则编译失败——这是保护机制
- 适合赋值或返回场景,例如:
String level = switch (score / 10) {
case 10, 9 -> "A";
case 8 -> "B";
case 7 -> "C";
default -> "F";
};
String 和 null 怎么安全处理?
String 类型的 switch 很常用,但有个硬伤:传入 null 会直接抛 NullPointerException,default 分支也救不了。
- 务必在 switch 前显式判空:if (cmd == null) { handleNull(); } else { switch(cmd) { ... } }
- Java 21+ 可用模式匹配语法:case null -> handleNull();,但低版本不行
- 别依赖 intern 或 == 比较,switch 对 String 就是走 equals(),放心用字面量
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











