跳到主要内容

Java Switch Case

什么是 Switch Case?

Switch Case 是 Java 中一种多分支选择语句,它提供了一种简洁的方式来根据单个变量或表达式的不同值执行不同的代码块。相比于使用多个 if-else 语句,Switch Case 结构更加清晰、可读性更高,尤其是在需要处理多个条件分支的情况下。

提示

Switch Case 语句是一种常用的控制流语句,能够有效减少复杂条件判断的嵌套层级,使代码更加清晰。

Switch 语法结构

Switch Case 的基本语法如下:

java
switch (expression) {
case value1:
// 当 expression 等于 value1 时执行的代码
[break;]
case value2:
// 当 expression 等于 value2 时执行的代码
[break;]
case value3:
// 当 expression 等于 value3 时执行的代码
[break;]
// 更多 case 语句...
default:
// 当 expression 不匹配任何 case 值时执行的代码
[break;]
}

关键要素解释

  1. expression(表达式):必须是特定类型的表达式,如 byteshortcharintenum 类型,以及 Java 7 开始支持的 String 类型。
  2. case value:必须是常量表达式或常量值,且类型必须与 switch 表达式兼容。
  3. break 语句:用于退出 switch 块,防止程序继续执行其他 case 分支。
  4. default 语句:可选,当没有匹配的 case 值时执行。

基本示例

让我们通过一个简单的例子来了解 Switch Case 的工作原理:

java
public class DayExample {
public static void main(String[] args) {
int day = 4;
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);
}
}

输出结果:

今天是星期四

Break 语句的重要性

在 switch 语句中,break 语句非常重要。如果省略了某个 case 分支的 break 语句,程序将继续执行下一个 case 分支中的代码,这被称为 "fall-through" 行为。

有 break 与无 break 的对比

java
public class BreakExample {
public static void main(String[] args) {
// 有 break 的例子
int num1 = 2;
System.out.println("有 break 的情况:");
switch (num1) {
case 1:
System.out.println("Case 1");
break;
case 2:
System.out.println("Case 2");
break;
case 3:
System.out.println("Case 3");
break;
default:
System.out.println("Default");
}

// 无 break 的例子
int num2 = 2;
System.out.println("\n无 break 的情况:");
switch (num2) {
case 1:
System.out.println("Case 1");
case 2:
System.out.println("Case 2"); // 从这里开始执行
case 3:
System.out.println("Case 3"); // 继续执行
default:
System.out.println("Default"); // 继续执行
}
}
}

输出结果:

有 break 的情况:
Case 2

无 break 的情况:
Case 2
Case 3
Default
警告

在大多数情况下,省略 break 语句可能会导致意外行为。只有在特定场景下,我们才会有意利用 fall-through 功能。

使用 String 类型的 Switch Case

从 Java 7 开始,Switch Case 语句支持 String 类型的表达式。这使得处理字符串比较变得更加简洁。

java
public class StringSwitchExample {
public static void main(String[] args) {
String fruit = "apple";

switch (fruit) {
case "apple":
System.out.println("苹果的价格是 $1.99 每斤");
break;
case "banana":
System.out.println("香蕉的价格是 $0.59 每斤");
break;
case "orange":
System.out.println("橙子的价格是 $0.89 每斤");
break;
default:
System.out.println("抱歉,我们没有这种水果");
break;
}
}
}

输出结果:

苹果的价格是 $1.99 每斤

使用枚举类型的 Switch Case

Switch 语句非常适合处理枚举类型,可以使代码更加清晰可读。

java
public class EnumSwitchExample {
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

public static void main(String[] args) {
Day today = Day.THURSDAY;

switch (today) {
case MONDAY:
System.out.println("今天是周一,开始新的一周!");
break;
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
System.out.println("今天是工作日中间时段");
break;
case FRIDAY:
System.out.println("今天是周五,即将迎来周末!");
break;
case SATURDAY:
case SUNDAY:
System.out.println("周末愉快!");
break;
}
}
}

输出结果:

今天是工作日中间时段

Switch 表达式 (Java 12+ 增强版)

从 Java 12 开始,Switch 语句得到了显著增强,引入了 Switch 表达式,可以直接返回值。在 Java 14 中,此功能被标准化。

java
// 注意:需要 Java 12 或以上版本
public class EnhancedSwitchExample {
public static void main(String[] args) {
int day = 3;

// 传统写法
String result1;
switch (day) {
case 1:
case 2:
case 3:
case 4:
case 5:
result1 = "工作日";
break;
case 6:
case 7:
result1 = "周末";
break;
default:
result1 = "无效日期";
break;
}
System.out.println("传统 switch 结果: " + result1);

// Java 12+ 增强写法 - 使用箭头语法
String result2 = switch (day) {
case 1, 2, 3, 4, 5 -> "工作日";
case 6, 7 -> "周末";
default -> "无效日期";
};
System.out.println("增强 switch 结果: " + result2);
}
}

输出结果:

传统 switch 结果: 工作日
增强 switch 结果: 工作日

实际应用场景

场景1:简单菜单系统

java
import java.util.Scanner;

public class MenuSystem {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

System.out.println("==== 简易计算器 ====");
System.out.println("1. 加法");
System.out.println("2. 减法");
System.out.println("3. 乘法");
System.out.println("4. 除法");
System.out.println("请选择操作 (1-4):");

int choice = scanner.nextInt();

System.out.println("请输入第一个数:");
double num1 = scanner.nextDouble();

System.out.println("请输入第二个数:");
double num2 = scanner.nextDouble();

double result;

switch (choice) {
case 1:
result = num1 + num2;
System.out.println(num1 + " + " + num2 + " = " + result);
break;
case 2:
result = num1 - num2;
System.out.println(num1 + " - " + num2 + " = " + result);
break;
case 3:
result = num1 * num2;
System.out.println(num1 + " * " + num2 + " = " + result);
break;
case 4:
if (num2 != 0) {
result = num1 / num2;
System.out.println(num1 + " / " + num2 + " = " + result);
} else {
System.out.println("错误:除数不能为零");
}
break;
default:
System.out.println("无效的选择");
break;
}

scanner.close();
}
}

场景2:HTTP 状态码解析器

java
public class HttpStatusCodeParser {
public static void main(String[] args) {
int statusCode = 404;

switch (statusCode) {
case 200:
System.out.println("200 OK - 请求成功");
break;
case 201:
System.out.println("201 Created - 资源创建成功");
break;
case 400:
System.out.println("400 Bad Request - 客户端请求语法错误");
break;
case 401:
System.out.println("401 Unauthorized - 需要身份验证");
break;
case 403:
System.out.println("403 Forbidden - 服务器拒绝请求");
break;
case 404:
System.out.println("404 Not Found - 服务器找不到请求的资源");
break;
case 500:
System.out.println("500 Internal Server Error - 服务器内部错误");
break;
default:
System.out.println("未知状态码");
break;
}
}
}

输出结果:

404 Not Found - 服务器找不到请求的资源

Switch 语句与 if-else 语句的比较

下面是 Switch 语句与等价的 if-else 语句的对比:

java
public class SwitchVsIfElse {
public static void main(String[] args) {
int grade = 85;

System.out.println("使用 if-else:");
if (grade >= 90) {
System.out.println("优秀");
} else if (grade >= 80) {
System.out.println("良好");
} else if (grade >= 70) {
System.out.println("一般");
} else if (grade >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}

System.out.println("\n使用 switch:");
switch (grade / 10) {
case 10:
case 9:
System.out.println("优秀");
break;
case 8:
System.out.println("良好");
break;
case 7:
System.out.println("一般");
break;
case 6:
System.out.println("及格");
break;
default:
System.out.println("不及格");
break;
}
}
}

输出结果:

使用 if-else:
良好

使用 switch:
良好

何时使用 Switch 语句?

  • 当有多个条件分支,且基于单个变量或表达式的值
  • 当可能的值是有限的、可预测的
  • 当需要提高代码可读性和可维护性

何时使用 if-else 语句?

  • 当条件涉及范围比较(大于、小于等)
  • 当条件基于多个变量
  • 当条件是复杂的布尔表达式

Switch Case 的注意事项与限制

  1. 表达式类型限制:switch 表达式只能是整数(byte、short、int、char)、枚举类型或字符串(Java 7+)。
  2. Case 值必须是常量:case 语句中的值必须是编译时常量,不能是变量或方法调用。
  3. Case 值不能重复:不能有两个 case 语句使用相同的值。
  4. Fall-through 行为:除非有 break 语句,否则代码会继续执行下一个 case 分支。

总结

Switch Case 语句是 Java 中一种强大的多分支条件结构,它提供了一种清晰、简洁的方式来处理多种可能的情况。主要特点包括:

  • 基于单个表达式的值选择执行路径
  • 支持整数、枚举和字符串类型
  • 使用 break 语句防止 fall-through
  • 可选的 default 分支处理未匹配的情况
  • Java 12 及以后版本中的增强语法(箭头操作符和返回值)

掌握 Switch Case 语句可以帮助你编写更加简洁、可读性更高的代码,尤其是在处理多分支条件时。

练习

  1. 编写一个程序,使用 Switch Case 语句根据月份数字(1-12)输出对应的月份名称。
  2. 创建一个简单的成绩转换器,使用 Switch Case 将数字成绩(0-100)转换为字母等级(A, B, C, D, F)。
  3. 实现一个简单的计算器程序,使用 Switch Case 处理不同的数学运算(加、减、乘、除)。

延伸阅读

  • 了解 Java 14 中引入的增强版 Switch 表达式的更多特性
  • 探索枚举类型与 Switch 语句的结合使用
  • 研究 Switch 语句在字节码层面的实现方式(跳转表或查找表)