详解Java中switch的新特性
作者:一一哥Sun 发布时间:2023-11-24 23:41:54
一. switch分支结构
1. 简介
switch结合case,能够判断一个变量或表达式与一系列值中的某个值是否相等,这里的每个值都被称为一个分支。switch语句在执行时,会先进行值的匹配,匹配成功时会进入到对应case语句。再根据是否有 break语句,判断是否继续输出,或是跳出当前switch判断。
2. 基本语法
在使用switch之前,首先我们得记住它的基本语法结构,其基本语法格式如下:
switch(值){
case 值1:
//switch中的值与值1相等时执行的代码
break; //可选
case 值2:
//switch中的值与值2相等时执行的代码
break; //可选
case 值3:
//switch中的值与值3相等时执行的代码
break; //可选
case 值4:
//switch中的值与值4相等时执行的代码
break; //可选
default:
//switch中的值与以上所有值都不相等时执行的代码
break; //可选
}
那么这个语法具体有哪些要求呢?请继续往下看。
3. 语法规则(重点)
根据上面介绍的switch语法结构,再给大家详细说一下switch的语法规则和要求。
switch(值)语句中的”值“,支持的类型有如下几类:
整型:byte、short、int 、char及其对应的包装类;
枚举类型,从JDK 5开始支持(后面会详细讲解枚举类型);
String类型,从JDK 7开始支持,同时case标签后的值必须是字符串常量或字面量。
switch后面可以有多个 case 语句,每个 case 后都要跟一个待比较的值和冒号。
case标签后面值的数据类型必须与switch(值)中的数据类型相同,且只能是常量或者字面常量。
当switch(值)的值与 case语句中的值相等时,case标签后面的语句开始执行,遇到break标签时停止执行switch语句。
case语句中不一定非要带有break语句。如果case后没有 break 语句,程序会继续执行下一个case 语句,直到出现 break 语句,这种现象叫做”case穿透“。
switch语句中可以包含一个default默认分支,该分支一般是 switch 语句的最后一个分支,当switch的值和case语句的值不相等时执行。default 分支中不用带有break 语句,另外该分支可以放在任何位置,但建议写在最后面。
4. 执行逻辑
根据上面的语法规则,我们可以结合下图来理解switch语句的执行逻辑。switch的执行逻辑,其实就相当于是把多种情况分别列出,根据我们输入的值来判断符合哪种情况。符合哪个情况,就进入到对应的分支里面去执行,整体的执行逻辑就是这样的,如下图所示:
了解完这些理论内容之后,接下来就给大家设计几个switch的案例,我们一起动手实操起来吧。
二. switch案例
1. 基本案例
案例需求:输入一个序号,代表今天是星期几,选择今天要做的事情。
/**
* @author
*/
public class Demo01 {
public static void main(String[] args) {
// switch结构
Scanner sc=new Scanner(System.in);
//根据输入的数字,选择每天要做的事情
System.out.println("请输入日期序号,代表今天是星期几");
int day = sc.nextInt();
switch (day) {
case 0:
System.out.println("星期天,休息休息");
break;
case 1:
System.out.println("星期一,开始搬砖");
break;
case 2:
System.out.println("星期二,搬砖好累");
break;
case 3:
System.out.println("星期三,离周末还有3天");
break;
case 4:
System.out.println("星期四,明天就是周五啦");
break;
case 5:
System.out.println("星期五,明天就是周六啦");
break;
case 6:
System.out.println("星期六,开心.....");
break;
default:
System.out.println("希望天天都是周末...");
break;
}
}
2. case穿透
在前面给大家讲过,如果 case 语句中没有 break 语句,当switch里的数值与case匹配成功后,会从当前 case 开始,把后续所有的 case 语句也都执行,这种现象叫做case穿透。一般情况下,我们要避免出现case穿透,防止一下执行多个语句。但有些时候,我们也可以利用这一特性,故意进行”穿透“。比如有几种情况的处理策略一样时,就可以通过”穿透“减少代码的编写。
接下来通过一个案例来给大家演示穿透现象。案例需求:选择A,输出”优秀“;选择B:输出”良好“;选择C:输出”一般“;选择D、E等:输出”很差“,其他情况则默认处理。不区分大小写,即选择A和a是一样的结果。
/**
* @author
*/
public class Demo01 {
public static void main(String[] args) {
// switch结构-case穿透
Scanner sc=new Scanner(System.in);
// 根据输入的数字,选择每天要做的事情
System.out.println("请输入成绩等级");
String level = sc.next();
switch (level) {
case "a":
case "A":
System.out.println("优秀");
break;
case "b":
case "B":
System.out.println("良好");
break;
case "c":
case "C":
System.out.println("一般");
break;
case "d"://故意case穿透
case "D":
case "E":
case "F":
System.out.println("很差");
break;
default:
System.out.println("成绩无效");
break;
}
}
三. switch新特性(了解)
1. 概述
我们知道,在使用switch时有可能会出现”case穿透“现象。如果你遗漏了break语句,有可能会造成严重的逻辑错误,而且这种错误还不太容易在源码中发现。所以为了防止意外出现”case穿透“,从JDK 12开始,switch语句升级成了更简单的表达式语法,使用了一种类似于模式匹配(Pattern Matching)的方式,确保只有一个路径会被执行,而且不再需要我们手动添加break语句。
这一新特性,可以说简化了不少无效代码,还规避了一定的风险,简直不要太赞哦。接下来就给大家设计几个案例,说说JDK 12中switch的使用。因为当前的JDK版本是JDK 17,可以向下兼容JDK 12,所以我们不用单独安装JDK 12哦。
2. 代码案例
2.1 ->符号
在JDK 12的switch语句中,支持使用 ->符号,当然也可以不使用->符号,继续采用以前的写法也没问题。如果case后面只有一条语句,可以直接在->后面编写该语句; 如果有多条语句,需要用 {} 括起来。另外在JDK 12的switch语句中,不用再写 break 语句,新的语法只会执行匹配的语句,不会出现”穿透效应“。
/**
* @author
*/
public class Demo01 {
public static void main(String[] args) {
// switch结构-case穿透
System.out.println("请选择你的国家");
Scanner sc = new Scanner(System.in);
String country = sc.next();
switch (country) {
case "中国" -> System.out.println("我是中国人,我自豪!");
case "日本" -> System.out.println("鬼子脚盆鸡");
case "美国" -> {
System.out.println("暂时还是老大");
System.out.println("喜欢欺负人");
}
default -> System.out.println("未知国籍,黑户");
}
}
}
2.2 switch中返回结果
在JDK 12中,我们可以把在 switch 语句中把产生的结果直接返回,不必再使用break语句进行结束。一般情况下,我们在switch表达式内部只会返回简单的值。但如果你想要处理多个复杂的语句,其实也可以写很多语句,这些代码都要放到放到 {...} 里面,然后使用 yield关键字(以后细讲) 进行返回。 配套案例如下:
/**
* @author
*/
public class Demo01 {
public static void main(String[] args) {
// switch结构-case穿透
System.out.println("请选择你的国家");
Scanner sc = new Scanner(System.in);
String country = sc.next();
// 注意:这里的返回值类型,可以是任意类型。我们后面在学习方法时再细说返回值的问题
String result = switch (country) {
case "中国" -> "我是中国人,我自豪!";
case "日本" -> "鬼子脚盆鸡";// 返回值只能有一个
case "美国" -> {
String str = "我们就喜欢以德服人";
// 注意:这里需要返回一个变量!!!
yield str;
}
default -> "未知国籍,黑户";
};// 注意:这里需要有个“;”,表示语句的结束
System.out.println("你的国家情况:" + result);
}
}
四. 结语
在本篇文章中,给大家介绍了switch分支结构,至此我们就把三大流程控制结构中的分支结构学习完毕了。结合前一篇文章中学习的if语句,给大家总结一下if与switch的异同点。
1. 相同点
if和switch都是Java里的分支选择语句,它俩都属于条件分支语句;
很多时候,if和swich可以实现的效果类似。
2. 不同点
switch结构只能处理等值条件判断的情况,且条件必须是整型、枚举变量或字符型变量;
多重if选择结构没有switch结构的诸多限制,特别适合某个变量处于某个连续区间时的情况;
if比switch应用范围更广、更灵活。if可以实现的条件判断,switch不一定能够实现;switch可以实现的条件判断,if肯定可以实现。
if 在应用中更为常见,但switch的结构更清晰。
switch使用查找表比对的方式,使得case的条件必须是连续的常量,if语句则没有这些限制。
一般情况下,switch比if-else效率更高。 因为switch内部使用了Binary Tree算法,不管有多少个case,都只计算一次值,直接跳转,不需逐个比较查询,除非是if-else的第一个条件就为true。
switch的效率其实与分支数无关。只有当分支比较少时,if语句的效率才比switch高,因为switch有跳转表。当分支较多时,推荐使用switch语句。
来源:https://juejin.cn/post/7194989425837735996


猜你喜欢
- 分页application.ymlspring: datasource: url: jdbc:mysql://127.0.0.1/jpa?u
- 发现问题在C#连接SQL Server时,明明添加了引用using System.Data.SqlClient;却出现了下面这种情况:原因:
- 1.查询后获取对应的数据集后,传递参数strcodeName,根据数据集中strcodeName的匹配对应字段,获取数据集中对应的目的字段p
- 1.非静态成员变量当成员变量为非静态成员变量且对当前类进行实例化时,将会产生死循环例子:public class ConstructorCl
- 上一篇我们说了Android中的tween动画,这一篇我们说说frame动画,frame动画主要是实现了一种类似于gif动画的效果,就是多张
- IDEA maven项目中刷新依赖的方法IDEA maven项目中刷新依赖分为自动刷新 和 手动刷新 两种!自动刷新File-Setting
- 本文实例讲述了使用adb命令向Android模拟器中导入通讯录联系人的方法。分享给大家供大家参考。具体实现方法如下:使用adb提供的命令,
- android新特性页面,ViewPager拖拽到最后一页再拖拽打开其他Activity.实现的方式有很多,效果比较好的就是到了
- 目前越来越多的app在注册或是进行对应操作时,要求获取短信验证码,在点击了获取短信验证码的按钮后,就是出现倒计时,比如倒计时120S,在倒计
- Feign Client 超时时间配置不生效解决方案Feign Client 的 connectTimeout 和 readTimeout
- 前言:在android HTML5 开发中有不少人遇到过 audio 标签 autoplay在某些设备上无效的问题,网上大多是讲怎么在js中
- Stream流多字段求和、汇聚实现方法利用Collectors.toMap(Function keyMapper, Function val
- 前言最近代码里和WebView有很多的交互,webview是android中的浏览器控件,这里主要介绍一下webview如何重载WebVie
- 最近在做项目的过程中 需要用JWT做登录和鉴权 查了很多资料 都不甚详细有的是需要在application.yml里进行jwt的配置 但我在
- 注解注解为我们在代码中添加信息提供一种形式化的方法,使我们可以在源码、编译时、运行时非常方便的使用这些数据。注解是在JAVA SE5中引入的
- socket 编程时的发送与接收数据时的问题在编写一个测试方法时,需要用启动一个程序监听一个端口,测试发送的数据是事正常,但是总是出现两个问
- 我们编程的过程中大部分使用了很出色的ORM框架,例如:MyBatis,Hibernate,SpringJDBC,但是这些都离不开数据驱动JD
- 本文实例为大家分享了TextView绘制背景的方法,供大家参考,具体内容如下效果:实现流程:1.初始化:对画笔进行设置mPaintIn =
- java 中锁的性能提高办法我们努力为自己的产品所遇到的问题思考解决办法,但在这篇文章中我将给大家分享几种常用的技术,包括分离锁、并行数据结
- <?xml version="1.0" encoding="utf-8"?> <L