switch 语句是 Java 中一个多路分支控制结构,它根据一个变量的值来决定执行哪一段代码,这个“变量”switch 的控制表达式。
switch 语句的基本语法
switch (expression) {
case value1:
// 当 expression 等于 value1 时,执行这里的代码
break; // 可选,用于跳出 switch
case value2:
// 当 expression 等于 value2 时,执行这里的代码
break; // 可选
// 可以有任意数量的 case
default:
// expression 不等于任何一个 case 的值,执行这里的代码
break; // 可选,但推荐加上
}
核心要点:switch 变量的类型(expression 的类型)
在 Java 中,switch 语句的控制表达式(也就是你问题中的“变量”)的类型有明确的限制,随着 Java 版本的更新,支持的范围也在不断扩大。
Java 7 之前(经典版本)
在 Java 7 及之前版本,expression 只能是以下几种基本数据类型:
byteshortcharint- 对应的包装类:
Byte,Short,Character,Integer
示例:
int day = 3;
switch (day) {
case 1:
System.out.println("Monday");
break;
case 2:
System.out.println("Tuesday");
break;
case 3:
System.out.println("Wednesday");
break;
default:
System.out.println("Unknown day");
break;
}
// 输出: Wednesday
Java 7 引入 String 类型
这是一个非常重要的更新,从 Java 7 开始,switch 语句可以直接使用 String 类型作为控制变量。
注意: 底层实现是通过 String.hashCode() 方法来实现的。switch 会先计算字符串的哈希码,然后与每个 case 标签的哈希码进行比较,如果哈希码相同,它还会使用 String.equals() 方法来确保内容真正相等,以避免哈希冲突。
示例:
String fruit = "Apple";
switch (fruit) {
case "Apple":
System.out.println("Apples are red or green.");
break;
case "Banana":
System.out.println("Bananas are yellow.");
break;
case "Orange":
System.out.println("Oranges are orange.");
break;
default:
System.out.println("Unknown fruit.");
break;
}
// 输出: Apples are red or green.
Java 14 引入 switch 表达式(预览特性)和模式匹配
从 Java 14 开始,switch 被升级为表达式,并且引入了更强大的模式匹配功能。
a. switch 表达式
switch 表达式可以直接返回一个值,不再需要 break 语句,每个 case 的代码块必须返回一个值,switch 整体也会返回一个值。
语法:
// 传统 switch 语句
String result;
switch (day) {
case 1, 2, 3, 4, 5: // Java 14+ 支持多个 case 用逗号分隔
result = "Weekday";
break;
case 6, 7:
result = "Weekend";
break;
default:
result = "Invalid day";
break;
}
// switch 表达式 (更简洁)
String resultExpr = switch (day) {
case 1, 2, 3, 4, 5 -> "Weekday"; // 使用箭头 -> 代替 case 和 break
case 6, 7 -> "Weekend";
default -> "Invalid day";
};
b. switch 表达式支持更多类型
Java 14 的 switch 表达式(正式版本在 Java 14 中发布)极大地扩展了支持的数据类型:
- 所有之前支持的类型 (
byte,short,char,int,String, 包装类) - 枚举类型 (
enum) - 这是 Java 5 引入的,但在switch表达式中得到了更好的支持。 var关键字 - 用于推断类型。
示例:使用枚举
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Day today = Day.WEDNESDAY;
// switch 表达式
String mood = switch (today) {
case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "Work hard!";
case SATURDAY, SUNDAY -> "Relax!";
};
System.out.println(mood); // 输出: Work hard!
Java 17 引入 switch 的模式匹配(预览特性)
这是 switch 功能的一次革命性升级,它不再局限于简单的值匹配,而是可以根据变量的类型和结构进行匹配。
示例:根据对象类型执行不同操作
// 这是一个 Object 变量,我们不知道它具体是什么类型
Object obj = "Hello, World!";
// 使用带类型模式的 switch
switch (obj) {
case Integer i -> System.out.println("It's an Integer: " + i);
case String s -> System.out.println("It's a String: " + s.toUpperCase());
case null -> System.out.println("It's null");
default -> System.out.println("It's something else: " + obj.getClass().getName());
}
// 输出: It's a String: HELLO, WORLD!
switch 语句 vs. if-else if 语句
| 特性 | switch 语句 |
if-else if 语句 |
|---|---|---|
| 适用场景 | 当一个变量需要在多个固定值之间进行选择时。 | 当条件是范围、布尔表达式或复杂逻辑时。 |
| 可读性 | 对于多值选择,代码结构更清晰。 | 对于少量条件,可能更直观。 |
| 性能 | 在某些情况下(如 JVM 优化后),switch 可能比一连串的 if-else if 更高效。 |
性能通常很好,但对于大量分支可能不如 switch 优化得好。 |
| 灵活性 | 传统 switch 只支持等值比较。switch 表达式/模式匹配 灵活性大大增强。 |
非常灵活,可以支持 >, <, , , &&, 等任何逻辑表达式。 |
| 类型支持 | 受限,但随 Java 版本增加而扩大。 | 支持任何可以返回布尔值的表达式。 |
switch变量:指的是switch(expression)中的expression,也称为控制表达式。- 类型演进:
- Java 7 前:仅限
byte,short,char,int及其包装类。 - Java 7+:增加了
String。 - Java 14+ (表达式):增加了对枚举和
var的更好支持,语法更简洁(使用->)。 - Java 17+ (模式匹配):革命性升级,支持基于类型和结构的匹配,功能极其强大。
- Java 7 前:仅限
break的重要性:在传统的switch语句中,忘记break会导致“贯穿”(fall-through),即程序会继续执行下一个case的代码,这通常是逻辑错误,在switch表达式中,break被箭头->替代,不存在贯穿问题。default:相当于if-else中的else,处理所有case都不匹配的情况,是良好的编程习惯。
在现代 Java 开发中,switch 已经从一个功能相对简单的分支语句,演变成了一个功能强大、表达力丰富的控制结构。
