switch 语句的基本语法
switch 语句的基本结构如下:

(图片来源网络,侵删)
switch (expression) {
case value1:
// 当 expression 等于 value1 时执行的代码
break; // 可选,用于跳出 switch
case value2:
// 当 expression 等于 value2 时执行的代码
break; // 可选
// 可以有任意数量的 case
default:
// expression 不匹配任何一个 case 时执行的代码
break; // 可选
}
语法要点:
-
expression(表达式):- 这是
switch语句的“开关”。 - 在 Java 7 及更高版本中,
expression的类型可以是:byteshortcharint- 枚举类型 (Enum)
String类型 (从 Java 7 开始引入)
- 在 Java 14 及更高版本中,还支持
switch表达式,其类型可以扩展到Integer,Short,Byte,Character,String或对应的包装类。
- 这是
-
case value:(情况分支):value必须是一个常量或常量表达式。expression的值会与每个case后的value进行比较。- 一旦匹配,程序就会执行该
case下的代码块。 - 注意:
case语句的值必须是唯一的,不能有两个case使用相同的值。
-
break(中断):break语句用于终止switch语句的执行,当执行到break时,程序会跳转到switch语句的末尾,继续执行后续代码。- 非常重要: 如果某个
case分支没有break,程序会“贯穿” (fall-through) 到下一个case分支并继续执行,直到遇到一个break或switch结束,这有时是故意的(用于合并多个情况),但更多时候是疏忽导致的 bug。
-
default(默认情况):
(图片来源网络,侵删)default是一个可选的分支。expression的值不匹配任何一个case的值,default分支中的代码就会被执行。default分支可以放在switch语句的任何位置,但通常习惯放在最后,它不需要break,因为它本身就是最后一个分支。
代码示例
示例 1:基本用法(带 break)
这是最常见、最标准的用法,避免了“贯穿”现象。
public class SwitchExample {
public static void main(String[] args) {
int day = 3;
String dayName;
switch (day) {
case 1:
dayName = "星期一";
break;
case 2:
dayName = "星期二";
break;
case 3:
dayName = "星期三";
break;
case 4:
dayName = "星期四";
break;
case 5:
dayName = "星期五";
break;
case 6:
dayName = "星期六";
break;
case 7:
dayName = "星期日";
break;
default:
dayName = "无效的日期";
break;
}
System.out.println("今天是 " + dayName);
}
}
// 输出: 今天是 星期三
示例 2:“贯穿” (Fall-through) 现象
这个例子展示了当没有 break 时会发生什么。
public class SwitchFallthrough {
public static void main(String[] args) {
int grade = 'B'; // 字符 'B' 的 ASCII 码值会被自动提升为 int
System.out.println("你的成绩是: " + grade);
switch (grade) {
case 'A':
System.out.println("优秀!");
case 'B':
System.out.println("良好!");
case 'C':
System.out.println("及格。");
case 'D':
System.out.println("不及格。");
default:
System.out.println("请输入有效的成绩等级 (A, B, C, D)。");
}
}
}
输出结果:
你的成绩是: 66
良好!
及格。
不及格。
请输入有效的成绩等级 (A, B, C, D)。
分析:
因为 grade 的值是 66('B'的ASCII码),它匹配了 case 'B',由于 case 'B' 后面没有 break,程序会继续执行 case 'C'、case 'D' 和 default 的代码,全部打印出来。
示例 3:利用“贯穿”合并多个情况
虽然“贯穿”通常是 bug,但有时我们可以利用它来简化代码,当多个 case 执行相同的操作时。
public class SwitchFallthroughUseful {
public static void main(String[] args) {
char vowel = 'E';
switch (vowel) {
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
System.out.println(vowel + " 是一个元音字母。");
break;
default:
System.out.println(vowel + " 是一个辅音字母。");
break;
}
}
}
// 输出: E 是一个元音字母。
示例 4:使用 String 类型(Java 7+)
switch 语句可以直接使用 String 类型,非常方便。
public class SwitchWithString {
public static void main(String[] args) {
String fruit = "Apple";
switch (fruit) {
case "Apple":
System.out.println("选择的是苹果。");
break;
case "Banana":
System.out.println("选择的是香蕉。");
break;
case "Orange":
System.out.println("选择的是橙子。");
break;
default:
System.out.println("未知的水果。");
break;
}
}
}
// 输出: 选择的是苹果。
现代化 switch:switch 表达式 (Java 14+)
从 Java 14 开始,switch 被升级为表达式,它不仅可以作为语句,还可以返回一个值,这大大简化了代码,并消除了对 break 和 return 的依赖。
特点:
- 返回值:
switch表达式可以直接赋值给一个变量。 - 箭头语法 (
->):使用->代替 ,每个case分支都是一个独立的代码块,执行完会自动跳出,无需break。 yield关键字:case中的代码块有多行,或者需要返回一个复杂的表达式,可以使用yield来返回一个值。
示例 5:使用 switch 表达式
public class SwitchExpression {
public static void main(String[] args) {
int day = 3;
String dayName;
// 使用 switch 表达式
dayName = switch (day) {
case 1 -> "星期一";
case 2 -> "星期二";
case 3 -> "星期三";
case 4 -> "星期四";
case 5 -> "星期五";
case 6 -> "星期六";
case 7 -> "星期日";
default -> "无效的日期";
};
System.out.println("今天是 " + dayName);
}
}
// 输出: 今天是 星期三
示例 6:yield 的使用
当 case 分支的逻辑比较复杂时,使用 yield 返回值。
public class SwitchExpressionYield {
public static void main(String[] args) {
int score = 85;
String grade;
grade = switch (score / 10) { // score / 10 得到 8
case 10, 9 -> "A";
case 8 -> {
if (score > 85) {
yield "A-"; // 使用 yield 返回
} else {
yield "B+";
}
}
case 7 -> "B";
default -> "C";
};
System.out.println("你的等级是: " + grade);
}
}
// 输出: 你的等级是: B+
switch vs. if-else if-else
| 特性 | switch 语句 |
if-else if-else 语句 |
|---|---|---|
| 可读性 | 当对一个单一变量进行多分支判断时,switch 通常更清晰、更结构化。 |
当判断基于多个不同条件或范围时,if-else 更自然。 |
| 判断类型 | 在传统用法中,只能用于等值判断 ()。 | 可以进行任何类型的判断(, >, <, , &&, 等)。 |
| 适用范围 | Java 7+ 支持 String,但主要还是针对离散值。 |
非常灵活,适用于任何条件逻辑。 |
| 性能 | 对于大量离散值的等值判断,switch(在底层有时会实现为 tableswitch 或 lookupswitch)可能比一长串 if-else 更高效。 |
性能通常不是主要考虑因素,除非判断极其复杂。 |
| 现代形式 | Java 14+ 的 switch 表达式功能强大,可以返回值。 |
传统形式,没有直接返回值的语法。 |
选择建议:
- 优先使用
switch:当你需要根据一个变量的具体值来执行不同操作时,例如处理命令、菜单选项、枚举值等。 - 使用
if-else:当你需要检查范围(如if (x > 10 && x < 20))、复合条件(如if (a || b))或判断多个不同变量时。
- 传统
switch语句:一个强大的多分支工具,核心是等值判断。一定要记得使用break,除非你故意利用“贯穿”特性。 switch表达式 (Java 14+):是switch语句的现代化演进,更简洁、更安全(无break),可以直接返回值,是现在推荐使用的形式。- 与
if-else的选择:根据判断条件的性质来决定。switch适用于单一变量的等值分支,if-else适用于更复杂的逻辑判断。
