java switch表达式仅支持能转为int的类型及特例:jdk1.4前限byte/short/char/int;jdk5增enum及包装类;jdk7增string;jdk14+支持sealed类模式匹配;long/float/double/boolean/普通对象(jdk14前)均不支持,case值必须为编译期常量。

直接记核心规律比死背版本更牢靠:Java 的 switch 表达式本质上只接受能转成 int 的类型,加上后来逐步扩展的特例。
按 JDK 版本演进记关键节点
不用硬记所有版本号,抓住三个分水岭:
-
JDK 1.4 及之前:仅支持
byte、short、char、int(它们都能无损提升为 int) -
JDK 5 开始:新增
enum(底层靠ordinal()返回 int)和对应包装类(Byte、Short、Character、Integer,编译器自动拆箱) -
JDK 7 开始:支持
String(编译器生成哈希 + equals 判断,本质仍是基于 int 的跳转) -
JDK 12+(预览)、14+(正式):支持
sealed类和模式匹配(如switch (obj) { case Integer i -> ... }),但这是高级用法,基础面试一般不考
哪些绝对不支持?一句话排除法
遇到不确定的类型,用这个逻辑快速判断:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- long:不行——值范围超 int,无法隐式转 int,编译报错
- float / double:不行——浮点精度问题,switch 要求精确匹配,不支持
- boolean:不行——只有 true/false,但 switch 设计初衷是多分支整数跳转,没提供语义支持
-
普通对象(如 ArrayList、自定义类):JDK 14 前不行;JDK 14+ 可用模式匹配,但必须配合
case模式语法,不是直接传对象
case 值的硬性要求
无论表达式是什么类型,每个 case 后面的值必须是编译期常量:
- 字面量:如
'a'、100、"hello" - final 修饰的静态或局部变量:如
final int MAX = 10;→case MAX: - 枚举常量:如
Color.RED - 不能是普通变量、方法调用、运算表达式(如
case x + 1:会编译失败)
一个口诀帮你过初面
“四基一串一枚举,包装自动拆得准;long浮点布尔全不行,case必须是常量。”
——“四基”指 byte/short/char/int,“一串”是 String,“一枚举”是 enum,“包装”指对应包装类,“常量”强调 case 值约束。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










