- 多个
case标签指向同一段代码:当多个不同的值需要执行相同的逻辑时。 - 在一个
case中处理多个条件:这是在 Java 14 引入的模式匹配(Pattern Matching)之后才支持的特性。
下面我们分别对这两种情况进行详细说明。

多个 case 标签指向同一段代码(最常见)
这是 switch 语句最经典和强大的用法之一,当你需要根据多个不同的输入值执行完全相同的操作时,可以将这些 case 标签写在一起,而不需要为每个 case 都重复写一遍代码块。
语法格式:
switch (expression) {
case value1:
case value2:
case value3:
// 当 expression 的值是 value1, value2, 或 value3 时,都会执行这里的代码
// ...
break;
case value4:
// ...
break;
default:
// ...
}
工作原理:
Java 会从上到下依次检查 expression 的值,如果匹配到任何一个 case(value1),程序就会进入该 case 标签对应的代码块,然后继续向下执行,直到遇到 break 语句或 switch 语句的末尾。
示例代码:

假设我们要根据星期几的数字(1-7)来输出“工作日”或“周末”,星期一(1)到星期五(5)都是工作日。
public class SwitchMultipleExample {
public static void main(String[] args) {
int dayOfWeek = 3; // 假设 3 代表星期三
switch (dayOfWeek) {
case 1: // 星期一
case 2: // 星期二
case 3: // 星期三
case 4: // 星期四
case 5: // 星期五
System.out.println("今天是工作日。");
break; // 必须有 break,否则会“贯穿”到下一个 case
case 6: // 星期六
case 7: // 星期日
System.out.println("今天是周末!");
break;
default:
System.out.println("输入的数字无效,请输入 1-7 之间的数字。");
break;
}
}
}
输出:
今天是工作日。
关键点:
break的重要性:如果没有break,程序会发生“贯穿”(fall-through)现象,如果去掉case 5的break,当dayOfWeek为 5 时,它会打印“今天是工作日。”,然后继续执行case 6的代码,打印“今天是周末!”,这通常不是我们想要的结果。default分支:这是可选的,但它是一个很好的编程习惯,用于处理所有未明确列出的情况,防止意外行为。
在一个 case 中处理多个条件(Java 14+)
在传统的 switch 语句中,一个 case 只能匹配一个值,但从 Java 14 开始,引入了模式匹配(Pattern Matching)特性,使得 switch 语句变得更加强大和灵活,你可以在一个 case 标签中使用逗号 来指定多个条件,这些条件可以是值、类型,甚至是更复杂的模式。

语法格式:
switch (expression) {
case value1, value2, value3:
// 当 expression 的值是 value1, value2, 或 value3 时,执行这里的代码
// ...
break;
case type1 var1, type2 var2:
// ...
break;
default:
// ...
}
示例代码 1:匹配多个值
这个例子和上面的“工作日”例子功能相同,但写法更简洁。
public class SwitchMultipleCaseExample {
public static void main(String[] args) {
int dayOfWeek = 3;
// 使用箭头语法 (->) 和多个 case 值 (Java 14+)
switch (dayOfWeek) {
case 1, 2, 3, 4, 5 -> System.out.println("今天是工作日。");
case 6, 7 -> System.out.println("今天是周末!");
default -> System.out.println("输入的数字无效,请输入 1-7 之间的数字。");
}
}
}
注意:这里使用了 ->(箭头)语法,这是 Java 14 引入的 switch 表达式的一部分,它更推荐使用,因为它可以避免 break 语句,并且整个 switch 可以返回一个值。
示例代码 2:类型模式匹配
这是更高级的用法。switch 可以根据表达式的类型来执行不同的逻辑。
public class SwitchTypePatternExample {
public static void main(String[] args) {
Object obj = "Hello, World!"; // 可以是 String, Integer, Double 等
// 使用 switch 表达式和类型模式
String result = switch (obj) {
case String s -> "这是一个字符串,内容是: " + s;
case Integer i -> "这是一个整数,值是: " + i;
case Double d -> "这是一个双精度浮点数,值是: " + d;
default -> "这是一个未知类型的对象。";
};
System.out.println(result);
}
}
输出:
这是一个字符串,内容是: Hello, World!
关键点:
- 版本要求:在一个
case中处理多个条件(特别是类型模式)是 Java 14 及以上版本 的特性,如果你使用的是更早的版本,编译器会报错。 switch表达式 vsswitch语句:switch语句:以switch (...) { ... }的形式出现,以break;结束代码块。switch表达式:以switch (...) { ... }的形式出现,但每个case都必须产生一个值(通常使用->语法),整个switch可以赋值给一个变量。- 对于新项目,强烈推荐使用
switch表达式,因为它更安全、更简洁。
总结与对比
| 特性 | 传统 switch (Java 7 及以前) |
增强型 switch (Java 14+) |
|---|---|---|
| 多个值执行同一逻辑 | 通过将多个 case 标签连续书写,共享一个代码块。 |
可以在一个 case 标签中用逗号分隔多个值,case 1, 2, 3:。 |
| 代码块结束 | 必须使用 break 语句来防止“贯穿”。 |
使用 -> 箭头语法的 switch 表达式不需要 break。 |
| 类型匹配 | 不支持。 | 支持,可以在一个 case 中匹配多种类型,case String s, Integer i:。 |
| 返回值 | switch 语句本身不返回值。 |
switch 表达式可以返回一个值,可以直接赋给变量。 |
| 可空性 | 不支持 null,会抛出 NullPointerException。 |
支持 case null: 来处理 null 值。 |
如何选择?
- 如果你使用的是 Java 13 或更早版本:你必须使用情况一的方法,即把多个
case标签写在一起,并确保在每个代码块末尾有break。 - 如果你使用的是 Java 14 或更高版本:强烈推荐使用情况二的
switch表达式,代码更清晰、更安全,也更不容易出错,它使得处理多个条件的逻辑变得非常直观。
