在 Java 中,switch 语句是用于基于不同条件执行不同代码块的一种控制流语句。与 if-else 语句相比,switch 更适合用于多个值的条件判断。它的语法简单、执行效率较高,尤其在处理多个可能值时,switch 提供了更清晰和结构化的代码。

1. Java 中的 switch 语句的基本用法

基本语法结构如下:

switch (表达式) {
    case 值1:
        // 如果表达式的结果等于值1,执行此代码块
        break;  // 退出 switch 语句
    case 值2:
        // 如果表达式的结果等于值2,执行此代码块
        break;
    default:
        // 如果表达式的结果没有匹配的值,执行此代码块
        break;
}
  • switch:用于判断的条件,通常是一个表达式。
  • case:每个case代表一个可能的值,switch 语句会根据该值来执行相应的代码块。
  • break:结束当前的 switch 语句。如果没有 break,则会继续执行下一个 case 中的代码,这被称为“穿透”行为(fall-through)。
  • default:是一个可选项。如果所有的 case 都不匹配,default 语句中的代码会执行。

2. 三种 switch 语句的语法

(1)传统的 switch 语句(用于 intcharString 等类型)

这是一种常见的 switch 使用方式。你可以根据整数值、字符或者字符串值来判断。

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("Invalid day");
}

解释:根据变量 day 的值来选择合适的输出,day == 3 会输出 "Wednesday"

(2)switch 语句与字符(char

switch 也可以使用字符类型来进行判断:

char grade = 'A';

switch (grade) {
    case 'A':
        System.out.println("Excellent");
        break;
    case 'B':
        System.out.println("Good");
        break;
    case 'C':
        System.out.println("Fair");
        break;
    default:
        System.out.println("Invalid grade");
}

解释:根据字符 grade 的值输出相应的评价。

(3)switch 语句与字符串(String

Java 7 及其以上版本支持 switch 使用 String 类型进行条件判断。这是一个非常常见的应用场景:

String color = "Red";

switch (color) {
    case "Red":
        System.out.println("The color is Red");
        break;
    case "Green":
        System.out.println("The color is Green");
        break;
    case "Blue":
        System.out.println("The color is Blue");
        break;
    default:
        System.out.println("Unknown color");
}

解释:根据字符串 color 的值选择输出内容。

3. switch 支持的参数类型

在 Java 中,switch 语句支持以下几种数据类型:

  • byte(8 位带符号整数)
  • short(16 位带符号整数)
  • char(16 位字符类型)
  • int(32 位带符号整数)
  • String(Java 7 及以上支持)
  • enum(Java 5 及以上支持)

switch 语句不支持以下数据类型:

  • longswitch 不支持 long 类型。即使是 long 的包装类 Long 也不行。
  • floatdoubleswitch 不能使用浮点数类型进行判断。
  • booleanswitch 不能使用布尔值进行判断。

4. 示例:switchenum 类型

enum 类型是 Java 中的一个重要数据类型,switch 可以用来判断 enum 类型的常量值:

enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }

Day today = Day.WEDNESDAY;

switch (today) {
    case MONDAY:
        System.out.println("Start of the work week");
        break;
    case WEDNESDAY:
        System.out.println("Midweek day");
        break;
    case FRIDAY:
        System.out.println("End of the work week");
        break;
    default:
        System.out.println("Weekend");
}

解释:使用 enum 类型的值来判断输出。在这里,如果 todayWEDNESDAY,输出将是 "Midweek day"

5. switch 语句的改进:Java 12 引入的 “switch expressions”

从 Java 12 开始,switch 被增强为一个表达式,不仅可以执行动作,还可以返回值。

int dayOfWeek = 3;
String result = switch (dayOfWeek) {
    case 1 -> "Monday";
    case 2 -> "Tuesday";
    case 3 -> "Wednesday";
    case 4 -> "Thursday";
    case 5 -> "Friday";
    case 6 -> "Saturday";
    case 7 -> "Sunday";
    default -> throw new IllegalArgumentException("Invalid day of the week: " + dayOfWeek);
};
System.out.println(result);

解释:在这种改进的 switch 中,-> 代表表达式的结果。这个语法简洁并且能够返回一个值。与传统的 switch 相比,新的 switch 语句可以直接返回一个值,并且每个 case 分支后不再需要 break 语句。


总结

  • switch 语句是一种便捷的多条件选择结构,适用于数值、字符、字符串等类型的判断。
  • switch 支持 intcharStringenum 等类型,并且从 Java 7 开始支持 String 类型。
  • Java 12 引入了 switch expressions,使得 switch 不仅可以执行动作,还可以返回值。