杰瑞科技汇

Java switch语句怎么用?

switch 语句的基本语法

switch 语句的基本结构如下:

Java switch语句怎么用?-图1
(图片来源网络,侵删)
switch (expression) {
    case value1:
        // 当 expression 等于 value1 时执行的代码
        break; // 可选,用于跳出 switch
    case value2:
        // 当 expression 等于 value2 时执行的代码
        break; // 可选
    // 可以有任意数量的 case
    default:
        // expression 不匹配任何一个 case 时执行的代码
        break; // 可选
}

语法要点:

  1. expression (表达式):

    • 这是 switch 语句的“开关”。
    • Java 7 及更高版本中,expression 的类型可以是:
      • byte
      • short
      • char
      • int
      • 枚举类型 (Enum)
      • String 类型 (从 Java 7 开始引入)
    • Java 14 及更高版本中,还支持 switch 表达式,其类型可以扩展到 Integer, Short, Byte, Character, String 或对应的包装类。
  2. case value: (情况分支):

    • value 必须是一个常量或常量表达式。
    • expression 的值会与每个 case 后的 value 进行比较。
    • 一旦匹配,程序就会执行该 case 下的代码块。
    • 注意: case 语句的值必须是唯一的,不能有两个 case 使用相同的值。
  3. break (中断):

    • break 语句用于终止 switch 语句的执行,当执行到 break 时,程序会跳转到 switch 语句的末尾,继续执行后续代码。
    • 非常重要: 如果某个 case 分支没有 break,程序会“贯穿” (fall-through) 到下一个 case 分支并继续执行,直到遇到一个 breakswitch 结束,这有时是故意的(用于合并多个情况),但更多时候是疏忽导致的 bug。
  4. default (默认情况):

    Java switch语句怎么用?-图2
    (图片来源网络,侵删)
    • 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;
        }
    }
}
// 输出: 选择的是苹果。

现代化 switchswitch 表达式 (Java 14+)

从 Java 14 开始,switch 被升级为表达式,它不仅可以作为语句,还可以返回一个值,这大大简化了代码,并消除了对 breakreturn 的依赖。

特点:

  1. 返回值switch 表达式可以直接赋值给一个变量。
  2. 箭头语法 (->):使用 -> 代替 ,每个 case 分支都是一个独立的代码块,执行完会自动跳出,无需 break
  3. 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(在底层有时会实现为 tableswitchlookupswitch)可能比一长串 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 适用于更复杂的逻辑判断。
分享:
扫描分享到社交APP
上一篇
下一篇