java 7起switch支持字符串,通过hashcode()和equals()双重校验实现;要求string类型且非null,case值须为编译期常量,java 14+支持箭头表达式。

Java 中 switch 语句从 JDK 7 开始支持字符串匹配,底层通过字符串的 hashCode() 和 equals() 双重校验实现,既保证效率又确保准确性。
语法要求:必须是 String 类型(且不能为 null)
传入 switch 的表达式必须是编译期确定类型的 String 对象,不能是 StringBuilder、StringBuffer 或其他 CharSequence 子类(如 StringBuffer 不被允许)。如果传入 null,运行时会抛出 NullPointerException,需提前判空。
- ✅ 正确:
switch (str) { case "apple": ... } - ❌ 错误:
switch (new StringBuilder("apple")) { ... } - ⚠️ 注意:
String s = null; switch(s) { ... }→ 直接崩溃
原理:先哈希再比对,安全又高效
编译器会将字符串 switch 编译为两层结构:先用 hashCode 快速分组(类似散列表),再在同 hash 值的 case 中逐个调用 String.equals() 确认。这样避免了逐个字符串 equals 的线性开销,性能接近整数 switch。
- 相同字符串(如 "abc")总是返回相同 hashCode,但不同字符串可能 hash 冲突 → 所以必须二次 equals
- 编译器自动优化,无需手动干预;也不建议自己用 hashCode 判断代替 case
使用注意事项
和普通 switch 一样,遵循 fall-through 规则,且每个 case 值必须是编译期常量(即字符串字面量或 final static String)。
- ✅ 允许:
final static String OK = "OK"; case OK: - ❌ 不允许:
case str1 + str2:(非常量表达式) - ✅ 推荐加
default分支处理未覆盖情况,增强健壮性 - ✅ Java 14+ 支持 switch 表达式写法(带箭头和 yield),更简洁:
String result = switch (day) {<br> case "Mon", "Tue" -> "Weekday";<br> case "Sat", "Sun" -> "Weekend";<br> default -> "Unknown";<br>};Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











