Java 7起switch支持String类型,基于equals()内容匹配且区分大小写,case必须为字符串字面量或final static常量,null值会抛NullPointerException,编译器通过hashCode和equals优化实现。

Java 中 switch 语句从 Java 7 开始正式支持 String 类型的匹配,这是对传统只支持 byte、short、int、char 及其包装类和 enum 类型的重要扩展。
需要注意的是:
-
switch对 String 的匹配是基于内容的比较(调用 equals 方法),不是引用比较; - 字符串值不能为
null,否则运行时抛出NullPointerException; - 编译器会将 String switch 编译为等效的
if-else链或结合哈希码优化的查找逻辑,性能接近但略低于整型 switch。
使用 String 的 switch 语法
String day = "Monday";
switch (day) {
case "Monday":
System.out.println("Start of work week");
break;
case "Friday":
System.out.println("Almost weekend!");
break;
case "Saturday":
case "Sunday":
System.out.println("Weekend");
break;
default:
System.out.println("Other day");
}关键细节与注意事项
-
区分大小写:
"hello"和"Hello"被视为不同 case,因为String.equals()是大小写敏感的; -
编译期常量要求:每个
case标签必须是字符串字面量或final static String常量(不能是普通变量或运行时计算结果); -
null 安全需手动处理:如果输入可能为 null,应在 switch 外提前判断,例如:
if (str == null) { // 处理 null } else { switch (str) { ... } }
底层原理简述
Java 编译器对 String switch 进行了特殊处理:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 先检查字符串是否为 null(若 null 则抛异常);
- 再根据字符串的
hashCode()快速分组,再用equals()精确匹配; - 实际生成的字节码可能包含一个
lookupswitch或tableswitch加辅助if判断,而非简单跳转表。
替代方案(Java 6 及更早)
若受限于旧版本,可用以下方式模拟:
立即学习“Java免费学习笔记(深入)”;
- 使用
if-else链配合equals(); - 将字符串映射为枚举,再对枚举 switch;
- 引入 Map<String, Runnable> 实现策略分发(适合分支较多场景)。
不复杂但容易忽略。

















