- 传统switch语句
- Java 7:引入String支持
- Java 12/13:switch表达式(预览,Java 14正式)
- Java 14:switch表达式正式化
- Java 17:switch模式匹配(预览)
- 使用建议
在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或
枚举类型。
- 。
- 必须是编译时常量(字面量或常量变量)。
- 块,防止意外穿透。
- 所有
- ),否则编译器会报错。
- 模式匹配还可以嵌套守卫(
- 子句检查字符串长度是否大于5,然后分别处理长字符串和短字符串。
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,然后分别处理长字符串和短字符串。
使用建议
| 场景 | 推荐选择 | 原因 |
|---|---|
| 分支较少(≤3) |
if-elseswitchswitch语句(传统或表达式)
if-elseswitch模式匹配(预览)
instanceof| + 强制转换 |
注意:
switch表达式必须穷举所有可能值(包括
default),否则编译错误,这提高了代码的安全性。
),否则编译错误,这提高了代码的安全性。
switch语句在Java中经历了一场华丽的“翻身仗”——从需要小心维护
break的传统语句,到无穿透的箭头语法,再到可以返回值的
switch表达式,最后发展到能够匹配类型和条件的模式匹配,它变得越来越强大、安全、简洁,掌握这些演变,不仅能写出更优雅的代码,还能充分利用新版本带来的生产力提升。
表达式,最后发展到能够匹配类型和条件的模式匹配,它变得越来越强大、安全、简洁,掌握这些演变,不仅能写出更优雅的代码,还能充分利用新版本带来的生产力提升。
在实际开发中,建议优先使用
switch表达式(Java 14+),它结合了简洁性和安全性;如果项目中使用了Java 17或更高版本,并开启了预览功能,不妨尝试模式匹配,让代码更具表达力。
表达式(Java 14+),它结合了简洁性和安全性;如果项目中使用了Java 17或更高版本,并开启了预览功能,不妨尝试模式匹配,让代码更具表达力。

