Java中switch支持的数据类型随版本演进持续扩展:Java 1–6支持byte、short、char、int及对应包装类;Java 5支持enum;Java 7支持String;Java 12引入switch表达式;Java 14起支持类型模式;Java 17支持sealed类模式匹配;Java 21正式落地完整模式匹配特性。

Java中switch支持的数据类型随着版本演进不断扩展:从最初的byte、short、char、int及其包装类,到Java 5支持枚举(enum),Java 7支持String,再到Java 14引入模式匹配预览(JEP 305)、Java 17正式支持sealed类的模式匹配,以及Java 21将switch模式匹配转为正式特性(JEP 441)。
基础类型与早期支持(Java 1–6)
最初,switch仅接受能隐式转为int的整数类型:
-
byte、short、char、int - 对应的包装类:
Byte、Short、Character、Integer(自动拆箱后参与比较) - 注意:
long不支持——编译报错“incompatible types”
枚举与字符串支持(Java 5 & 7)
Java 5起可直接用enum常量作为case值;Java 7起允许String(内部通过hashCode()和equals()实现,非单纯哈希跳转):
- 枚举case必须是同一枚举类型的显式常量,如
DayOfWeek.MONDAY -
String区分大小写,且null传入会抛NullPointerException(需提前判空) - 编译器对String switch做了优化,通常生成二分查找或哈希表跳转,性能接近整型switch
表达式语法与模式匹配(Java 12–21)
Java 12开始引入switch表达式(带->箭头语法,自动终止,无fall-through),Java 14起支持类型模式(如case String s -> s.length()),Java 21正式落地完整模式匹配:
立即学习“Java免费学习笔记(深入)”;
- 支持在case中声明局部变量并绑定值,例如
case Integer i -> i * 2 - 可组合多种模式:
case null, String s, Integer i -> ... - 支持记录(record)解构:
case Point(int x, int y) -> x + y - 要求所有可能路径必须被覆盖(或有
default),编译器强制穷尽性检查(尤其配合sealed类时)
注意事项与常见误区
实际使用中需注意版本兼容性和语义变化:
- 老代码中的
break语句在switch表达式中不允许出现(会编译错误) - 传统switch语句仍存在fall-through行为;新表达式用
->则完全隔离各分支 - 泛型类型擦除导致无法在case中直接写
case List——模式匹配只支持具体类型或其子类型l - Android开发需留意:只有API 34+(对应Java 17+特性)才支持switch模式匹配









