java从jdk 7起支持字符串switch,底层通过hashcode()和equals()实现,需防null指针;case后只能是字符串字面量或常量,区分大小写,无自动null处理,应提前判空。

Java 中从 JDK 7 开始支持用 switch 匹配字符串,本质是编译器在底层将字符串的 hashCode() 和 equals() 结合使用来实现的,不是直接比较引用。写法和匹配整数类似,但要注意空指针和性能细节。
语法结构和基本用法
字符串 switch 的语法与传统 switch 一致,只是表达式类型为 String:
- case 后必须是字符串字面量或常量(编译期可确定的值),不能是变量或表达式
- 字符串比较区分大小写,且会自动处理
null—— 如果传入null,运行时直接抛NullPointerException - 每个 case 分支末尾需加
break,否则会“穿透”到下一个 case(除非有意为之)
避免空指针异常
由于 switch 对 null 不做特殊处理,最安全的做法是提前判空:
智能模型自动切换 V5.0.2 - 多模态感知,自动识别图片/视频/音频/代码/文本任务,切换最优模型。支持图片理解(qwen3-vl-plus)、视频音频(qwen3.5-plus)、代码(glm-5)、Office文档(MiniMax-M2.5)、推理等场景。零感知切换,无需手动操作。
- 在 switch 外用
if (str == null)单独处理 - 或者把判空逻辑放进第一个 case(不推荐,可读性差)
- 也可以用
Objects.equals(str, "xxx")改写为 if-else,但失去 switch 的简洁性
底层原理简要说明
编译后,javac 实际生成的是先调用 String.hashCode() 做一次 int switch,再在每个匹配的分支里用 equals() 做精确比对。这意味着:
- 如果多个字符串 hashCode 相同(哈希碰撞),性能会略下降,但语义完全正确
- 不需要手动重写 hashCode 或 equals,JDK 自带 String 实现已足够可靠
- 不建议在 case 中用非常长的字符串(虽合法,但影响可读性和编译速度)
一个实用示例
比如解析 HTTP 方法名:
String method = request.getMethod(); // 可能是 "GET"、"POST" 等
if (method == null) {
throw new IllegalArgumentException("Method cannot be null");
}
switch (method) {
case "GET":
handleGet();
break;
case "POST":
handlePost();
break;
case "PUT":
handlePut();
break;
case "DELETE":
handleDelete();
break;
default:
throw new UnsupportedOperationException("Unsupported method: " + method);
}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










