杰瑞科技汇

java switch 变量

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 只能是以下几种基本数据类型:

  • byte
  • short
  • char
  • int
  • 对应的包装类: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 版本增加而扩大。 支持任何可以返回布尔值的表达式。
  1. switch 变量:指的是 switch(expression) 中的 expression,也称为控制表达式
  2. 类型演进
    • Java 7 前:仅限 byte, short, char, int 及其包装类。
    • Java 7+:增加了 String
    • Java 14+ (表达式):增加了对枚举和 var 的更好支持,语法更简洁(使用 ->)。
    • Java 17+ (模式匹配):革命性升级,支持基于类型结构的匹配,功能极其强大。
  3. break 的重要性:在传统的 switch 语句中,忘记 break 会导致“贯穿”(fall-through),即程序会继续执行下一个 case 的代码,这通常是逻辑错误,在 switch 表达式中,break 被箭头 -> 替代,不存在贯穿问题。
  4. default:相当于 if-else 中的 else,处理所有 case 都不匹配的情况,是良好的编程习惯。

在现代 Java 开发中,switch 已经从一个功能相对简单的分支语句,演变成了一个功能强大、表达力丰富的控制结构。

分享:
扫描分享到社交APP
上一篇
下一篇