Java switch支持的数据类型随JDK版本演进:5–6支持byte/short/char/int及包装类;7增加String;14起支持表达式化与多值合并;23引入原始类型模式匹配。

Java 的 switch 分支支持的数据类型不是一成不变的,而是随着 JDK 版本持续演进,每次升级都解决了一类实际开发中的表达力或安全性问题。理解这个过程,能帮你写出更兼容、更健壮的代码。
Java 5–6:仅限整型基础族
最初只支持 byte、short、char、int 及其对应的包装类型(Byte、Short、Character、Integer),依赖 JVM 的 tableswitch 或 lookupswitch 指令实现 O(1) 跳转。这些类型本质都是 32 位以内整数,编译期可确定跳转表范围。
- 不支持
long——因跳转表无法高效覆盖 64 位空间 - 不支持
float/double——浮点精度不可靠,且无整型语义 - 不支持
boolean——只有两个值,用 if 更自然;JVM 也未为其设计跳转指令
Java 7:String 正式入场
引入对 String 类型的支持,底层通过字符串的 hashCode() 分桶 + equals() 二次校验实现,不再是简单的数值比较。
- case 值必须是编译期常量(如
"GET"、CONSTANT),不能是运行时拼接或方法调用结果 - 传入
null会直接抛NullPointerException,不会进入任何分支 - 区分大小写,无隐式转换(
"a"≠"A")
Java 14 起:表达式化与模式匹配萌芽
switch 不再只是语句,开始作为表达式出现,要求全覆盖、自动终止、支持返回值:
立即学习“Java免费学习笔记(深入)”;
- 语法切换为
case value ->,省略break,天然防穿透 - 必须包含
default(或穷尽所有枚举常量),否则编译失败 - 支持多值合并:
case "MON", "TUE", "WED" -> 1 - 复合逻辑用
{ ... yield value; }结构
JDK 23:原始类型模式匹配落地
在 switch 表达式中正式支持类型模式匹配,允许在 case 中声明带类型的变量并做条件判断:
-
case int n when n >= 90 -> "A":直接解包并限定范围 case String s when s.length() > 0 -> s.toUpperCase()- 编译器确保类型安全,避免手动 instanceof + 强转
- 仍不支持
long直接作为主导类型,但可通过模式匹配间接处理(如先转为BigInteger或拆解逻辑)


















