1. 传统switch语句
  2. Java 7:引入String支持
  3. Java 12/13:switch表达式(预览,Java 14正式)
  4. Java 14:switch表达式正式化
  5. Java 17:switch模式匹配(预览)
  6. 使用建议

在Java编程中,

switch

语句是一种经典的多分支选择结构,它允许程序根据表达式的值从多个候选分支中执行相应的逻辑,随着Java版本的迭代,

switch

从最初略显笨拙的语法逐渐演变为更灵活、更安全的表达式,本文将系统讲解

switch

的核心用法,涵盖传统写法、对

String

类型的支持、

switch

表达式以及最新的模式匹配特性,并提供实用的代码示例说明,帮助您全面掌握这一关键语法。

表达式以及最新的模式匹配特性,并提供实用的代码示例说明,帮助您全面掌握这一关键语法。

传统switch语句

基本语法

传统

switch

语句的基本结构如下:以关键字

switch

开头,后面紧跟一个圆括号包裹的表达式(称为“key”),内部由多个

case

标签和一个可选的

default

标签组成,每个

case

后面需跟一个编译时常量,然后是一个冒号,接着是待执行的语句,通常在每个分支末尾添加

break

语句来退出

switch

,否则会发生“穿透”(fall-through),即继续执行下一个

case

的代码。

的代码。

  • key

    必须是一个整数类型

    byte

    short

    char

    int

    )或它们的包装类型,在Java 7之后,也可以是

    String

    枚举类型

  • case

    后面的

    value

    必须是编译时常量(字面量或常量变量)。

  • 必须是编译时常量(字面量或常量变量)。
  • break

    用于跳出

    switch

    块,防止意外穿透。

  • 块,防止意外穿透。
  • 典型示例

    需要将数字1到3映射为星期名称:定义整型变量day为3,使用

    switch

    语句对day进行判断,在

    case 1

    中赋值“Monday”,

    case 2

    中赋值“Tuesday”,

    case 3

    中赋值“Wednesday”,

    default

    中赋值“Unknown”,每个分支后都加上

    break

    ,最终输出结果为“Wednesday”。

    ,最终输出结果为“Wednesday”。

    穿透行为与利用

    如果某个

    case

    分支没有

    break

    ,程序会继续执行后续的

    case

    代码,直到遇到

    break

    switch

    结束,这一特性有时会被巧妙利用,例如将多个

    case

    写在一起以共享同一段逻辑,判断月份天数时,可以将31天的月份(1、3、5、7、8、10、12)合并为一个分支,30天的月份(4、6、9、11)合并为另一个分支,2月单独处理,这样利用穿透特性减少了重复代码。

    写在一起以共享同一段逻辑,判断月份天数时,可以将31天的月份(1、3、5、7、8、10、12)合并为一个分支,30天的月份(4、6、9、11)合并为另一个分支,2月单独处理,这样利用穿透特性减少了重复代码。

    注意:手动管理

    break

    容易遗漏,导致逻辑错误,现代Java推荐使用更安全的表达式语法以避免此类问题。

    容易遗漏,导致逻辑错误,现代Java推荐使用更安全的表达式语法以避免此类问题。

    Java 7:引入String支持

    从Java 7开始,

    switch

    key

    支持

    String

    类型,这在处理字符串分支时非常方便,定义字符串变量fruit为“apple”,在

    switch

    中对fruit进行匹配,分别处理“apple”、“banana”、“cherry”等字符串,值得注意的是,字符串比较是区分大小写的,因此建议先统一调用

    toLowerCase()

    toUpperCase()

    case

    标签仍然必须是字符串字面量,不能是变量。

    标签仍然必须是字符串字面量,不能是变量。

    Java 12/13:switch表达式(预览,Java 14正式)

    传统

    switch

    语句,执行后没有返回值,从Java 12开始,引入了

    switch

    表达式,它可以直接产生一个值,并支持箭头语法(

    ->

    )来简化代码,大大减少了重复代码和手动管理

    break

    的烦恼。

    的烦恼。

    箭头语法(

    ->

    箭头语法右侧只能是一个表达式、代码块或

    throw

    语句,这种方式没有穿透,因此无需写

    break

    ,将数字1到5映射为星期名称:使用

    switch

    表达式直接赋值给一个字符串变量,每个

    case

    后面用箭头指向对应的返回值,如果分支需要执行多条语句,可以使用代码块,并在代码块内部用

    yield

    关键字返回一个值。

    关键字返回一个值。

    逗号分隔多个case值

    case

    标签中可以用逗号一次性列出多个常量,避免了传统写法中写多个

    case

    的冗余,可以将分数段90~100的多个值合并为一个分支,统一返回“A”。

    的冗余,可以将分数段90~100的多个值合并为一个分支,统一返回“A”。

    yield关键字

    在复杂的

    switch

    表达式中,如果某个分支需要执行多条语句并返回一个值,可以使用

    yield

    ,根据年龄分类时,对于默认分支,可以写一个代码块,内部用

    if-else

    判断年龄是否小于18,然后用

    yield

    返回相应的字符串。

    返回相应的字符串。

    Java 14:switch表达式正式化

    Java 14将

    switch

    表达式从预览升级为正式特性,所有上述箭头语法、

    yield

    、多值

    case

    成为标准,这意味着开发者可以在生产代码中放心使用这些新特性,享受其带来的简洁性和安全性。

    成为标准,这意味着开发者可以在生产代码中放心使用这些新特性,享受其带来的简洁性和安全性。

    Java 17:switch模式匹配(预览)

    Java 17带来了模式匹配,允许

    case

    标签不再是简单的字面量,而是可以匹配类型、解构等,不过该特性目前仍处于预览阶段(需要在编译和运行时启用

    --enable-preview

    ),可以定义一个方法,接收一个Object参数,使用

    switch

    表达式分别匹配

    Integer

    Double

    String

    类型,甚至匹配

    null

    ,每个

    case

    分支中可以直接将匹配到的类型赋值给一个变量(如

    case Integer i

    ),然后在右侧使用该变量。

    ),然后在右侧使用该变量。

  • 所有
  • case

    分支必须覆盖所有可能的类型(包括

    null

    ),否则编译器会报错。

  • ),否则编译器会报错。
  • 模式匹配还可以嵌套守卫(
  • when

    子句),进一步增强条件判断,对于

    String

    类型,可以先用

    when

    子句检查字符串长度是否大于5,然后分别处理长字符串和短字符串。

  • 子句检查字符串长度是否大于5,然后分别处理长字符串和短字符串。
  • 使用建议

    场景推荐选择原因
    分支较少(≤3)
    if-else

    更直观,代码行数少分支较多且每个分支逻辑简单

    switch

    表达式(箭头语法)可读性强,无穿透风险分支较多且依赖于整数、枚举或字符串

    switch

    语句(传统或表达式)性能优于多个

    if-else

    (编译器会生成跳转表)需要对对象类型做多重判断

    switch

    模式匹配(预览)替代

    instanceof

    + 强制转换

    + 强制转换

    注意

    switch

    表达式必须穷举所有可能值(包括

    default

    ),否则编译错误,这提高了代码的安全性。

    ),否则编译错误,这提高了代码的安全性。

    switch

    语句在Java中经历了一场华丽的“翻身仗”——从需要小心维护

    break

    的传统语句,到无穿透的箭头语法,再到可以返回值的

    switch

    表达式,最后发展到能够匹配类型和条件的模式匹配,它变得越来越强大、安全、简洁,掌握这些演变,不仅能写出更优雅的代码,还能充分利用新版本带来的生产力提升。

    表达式,最后发展到能够匹配类型和条件的模式匹配,它变得越来越强大、安全、简洁,掌握这些演变,不仅能写出更优雅的代码,还能充分利用新版本带来的生产力提升。

    在实际开发中,建议优先使用

    switch

    表达式(Java 14+),它结合了简洁性和安全性;如果项目中使用了Java 17或更高版本,并开启了预览功能,不妨尝试模式匹配,让代码更具表达力。

    表达式(Java 14+),它结合了简洁性和安全性;如果项目中使用了Java 17或更高版本,并开启了预览功能,不妨尝试模式匹配,让代码更具表达力。

    Java switch语句用法详解,从基础到Java 17新特性-switch游戏下载社区