18从零开始学Java之switch分支语句中该怎么用?

news/2024/11/28 5:14:10/

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦

CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者

前言

在上一篇文章中,壹哥给大家介绍了Java里的顺序、分支、循环结构的概念,并且重点给大家讲解了分支结构中的条件分支。并在条件分支中,详细地给大家讲解了if条件分支的使用。现在我们应该知道,if条件分支可以有单分支、多分支、嵌套等多种形式。但实际上,if分支能够实现的效果,在有些时候可以被另一种技术替代,这就是switch分支结构。

----------------------------------------------前戏已做完,精彩即开始--------------------------------------------

全文大约【3300】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富案例及配图视频,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考......

一. 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 一一哥Sun* QQ:2312119590* 千锋教育*/
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 一一哥Sun* QQ:2312119590* 千锋教育*/
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 一一哥Sun* QQ:2312119590* 千锋教育*/
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 一一哥Sun* QQ:2312119590* 千锋教育*/
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语句。

所以如果你以后再遇到条件判断,知道该怎么选择实现了吗?在接下来的文章中,壹哥会带领大家继续学习循环结构,敬请各位继续关注哦。

另外如果你独自学习觉得有很多困难,可以加入壹哥的学习互助群,大家一起交流学习。

五. 配套视频

如果你不习惯阅读技术文章,或是对文中的技术概念不能很好地理解,可以来看看壹哥帮你筛选出的视频教程。与本文配套的Java学习视频,链接如下:

bilibili html5 player

六. 今日作业

1. 第一题

小明给自己的手机设置了自动拨号,功能如下:

按1:拨爸爸的号

按2:拨妈妈的号

按3:拨爷爷的号

按4:拨奶奶的号

其他:拨打110

请用代码模拟出该功能,可以在评论区给出你的代码实现哦。

 


http://www.ppmy.cn/news/41800.html

相关文章

Python 纯函数与副作用,可变参数与不可变参数

文章目录纯函数与副作用纯函数副作用参数传递不可变对象(值类型)可变对象(引用类型)参数传递方式纯函数与副作用 在Python的函数式编程中,Python既可以在调用时对实参进行修改,也可以通过返回值返回函数调…

咖啡卷到现在,他们开始往里面掺北京豆汁了

咖啡卷到现在,他们开始往里面掺北京豆汁了0. 导读1. 人手一杯,果咖大势所趋2. 双倍成瘾:茶咖和酒咖被重点推荐3. 地方小吃融入咖啡,比如北京豆汁4. 炙手可热的云南咖啡豆5. 咖啡、户外和环保:绑定可持续6. 小结0. 导读…

可选择的Elasticsearch好用的可视化客户端工具

前言 常言道:工欲善其事,必先利其器。对于我们开发和测试同学来说,在日常的工作中有一款趁手的工具那真实如虎添翼啊,工作效率可是蹭蹭蹭的往上长,节省下来的时间摸摸鱼该有多好啊。最近我们系统开始使用elasticsearc…

VAE 理论推导及代码实现

VAE 理论推导及代码实现 熵、交叉熵、KL 散度的概念 熵(Entropy) 假设 p (x)是一个分布函数,满足在 x 上的积分为 1,那么 p(x)p(x)p(x)的熵定义为 H(p(x))H (p (x))H(p(x)),这里我们简写为 H(p)H(p)H(p) H(p)∫p(x)…

45-Dockerfile-ARG/ENV指令

AGR/ENV指令前言ARG作用格式说明生效范围使用示例ENV作用格式说明使用环境变量使用示例ARG 和 ENV 的区别前言 本篇来学习下Dockerfile中的AGR/ENV指令 ARG 作用 定义一个可以在构建镜像时使用的变量 格式 ARG <name>[<default value>]说明 在执行 docker b…

21-CSS

目录 1.CSS是什么&#xff1f; 2.CSS基本语法 3.CSS类型 3.1.行内样式&#xff08;适用范围最小&#xff09; 3.2.内部样式&#xff08;适用范围适中&#xff09; 3.3.外部样式&#xff08;适用范围最大&#xff09; PS&#xff1a;关于缓存 3.4.多种样式优先级 4.代码…

Java语言中的Calendar和Date两个类区别

Java语言中的Calendar和Date两个类都用于处理日期和时间&#xff0c;但它们在实现和使用方面有着很大的不同。实现方式 Date类是一个时间戳&#xff0c;它以自UTC&#xff08;格林尼治标准时间&#xff09;1970年1月1日午夜&#xff08;零时&#xff09;起所经历的毫秒数来表示…

Linux 中的 System.map简介

源码基于&#xff1a;Linux 5.4 0. 前言 对于计算机而言是没有符号这个概念的&#xff0c;只有0 和 1&#xff0c;但是我们比较容易理解的是函数名、变量名这样的符号。在Linux 内核中用 System.map 来记录Linux 内核中的符号信息&#xff0c;称为内核的符号表&#xff0c;该文…