java中switch-case根据表达式值跳转分支,不支持布尔逻辑组合(如a>5&&b

Java 中 switch-case 用以根据一个表达式的值,跳转到多个分支中的某一个执行。它不支持任意布尔逻辑组合(比如 a > 5 && b ),而是基于“精确匹配”——即与每个 <code>case 后的常量值逐一比对。
支持的匹配类型(JDK 版本有影响)
switch 表达式要求是可“归一化”的确定值,早期只支持 byte、short、int、char 和 enum;从 JDK 7 开始支持 String;JDK 14 起引入 switch 表达式(带 -> 箭头语法),JDK 17 正式支持 sealed 类型和模式匹配(需配合 instanceof 使用)。
-
int、char、byte、short:自动装箱/拆箱后可直接用 -
String:比较内容(内部调用equals()),不是引用地址 -
enum:推荐写法,类型安全且可读性强 -
Integer等包装类:在 JDK 7+ 中允许,但要注意 null 值会抛NullPointerException
case 匹配规则与常见陷阱
每个 case 后必须是编译期常量(如字面量、final static 变量),不能是变量或运行时计算结果。多个 case 可共享一段代码(“贯穿”),但容易出错,建议显式加 break 或改用新式箭头语法避免。
- 漏写
break会导致“case 穿透”,后续 case 语句也会执行(除非遇到break或方法返回) -
default不是必需的,但强烈建议加上,处理未覆盖的值,提升健壮性 -
case值不能重复,否则编译报错:“duplicate case label” - 字符串匹配区分大小写,
"A"和"a"是不同分支
新式 switch 表达式(JDK 14+ 推荐)
使用 -> 替代冒号,自动终止、无穿透风险,还能作为表达式返回值,更简洁安全:
String dayType = switch (day) {
case "Mon", "Tue", "Wed", "Thu", "Fri" -> "Weekday";
case "Sat", "Sun" -> "Weekend";
default -> "Invalid";
};
- 多个值可用逗号分隔(如
case "Mon", "Tue") - 每个分支独立作用域,可声明同名局部变量
- 必须覆盖所有可能路径(或有
default),否则编译失败 - 若需多行逻辑,用大括号包裹,并用
yield返回结果
无法用 switch 的情况,该用什么替代?
当条件涉及范围判断(如 x )、布尔组合(如 <code>a && !b)、null 安全检查或复杂对象状态时,switch 不适用,应改用 if-else if-else 链。
- 范围匹配示例:
if (score >= 90) {...} else if (score >= 80) {...} - 对象状态判断:优先考虑策略模式、枚举方法或
instanceof+ 模式匹配(JDK 16+) - 需要短路求值或副作用操作(如方法调用)时,
if更直观可控
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











