前言

在上一篇文章中,壹哥给大家介绍了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. 基本案例

案例需求:输入一个序号,代表今天是星期几,选择今天要做的事情。

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是一样的结果。

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语句,新的语法只会执行匹配的语句,不会出现”穿透效应“。

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关键字(以后细讲)进行返回。配套案例如下:

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语句。

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

五. 今日作业

第一题

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

按1:拨爸爸的号

按2:拨妈妈的号

按3:拨爷爷的号

按4:拨奶奶的号

其他:拨打110

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

「java技术干货」switch分支结构详解的更多相关文章

  1. Python 流程控制-分支结构详解

    目录 Python 流程控制--分支结构 1.结构分类 顺序结构 分支结构 循环结构 2.分支结构详解 分支结构 定义格式: if 单支结构 if 双分支结构 if 多分支结构 Python 流程控制 ...

  2. 5月份值得一看的 Java 技术干货!

    5月又即将要离我们远去了,这个月有小长假51劳动节,有54青年节,有513母亲节,更有坑爹的520神马节?!! 废话不说,又到了总结上个月干货的时候了,这个月我们带来了各种Java技术干货,都是不得不 ...

  3. 推荐:7 月份值得一看的 Java 技术干货!

    月底了,又到了我们总结这一个月 Java 技术干货的时候了,又到了我们给粉丝免费送书的日子了. 7 月份干货总结 Oracle 发布了一个全栈虚拟机 GraalVM 一文带你深入拆解 Java 虚拟机 ...

  4. 「硬核干货」总结IDEA开发的26个常用设置

    前言 程序员对待IDE都是虔诚的,经常因为谁是最好的IDE而在江湖上掀起波澜,曾经我也是. 后来我遇到了IDEA,从此是它,余生都是它. IDEA 毫无疑问是目前最强大的Java开发工具了,但是大部分 ...

  5. Java内存结构详解

    Java内存结构详解 Java把内存分成:栈内存,堆内存,方法区,本地方法区和寄存器等. 下面分别介绍栈内存,堆内存,方法区各自一些特性: 1.栈内存 (1)一些基本类型的变量和对象的引用变量都是在函 ...

  6. Java工程师 基础+实战 完整路线图(详解版)

    Java工程师 基础+实战 完整路线图(详解版)   Java 基础 Java 是一门纯粹的面向对象的编程语言,所以除了基础语法之外,必须得弄懂它的 oop 特性:封装.继承.多态.此外还有泛型.反射 ...

  7. web标准 浏览器介绍 开发工具介绍 HTML介绍 HTML颜色介绍 规范 HTML结构详解 {前端之前端初识}

    前端之前端初识   前端初识 本节目录 一 web标准 二 浏览器介绍 三 开发工具介绍 四 HTML介绍 五 HTML颜色介绍 六 规范 七 HTML结构详解 一 web标准 web准备介绍: 1. ...

  8. JVM之内存结构详解

    对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bug.同时,JVM也是面试环节的中重灾区.今天开始,<JVM详解>系列开启,带大家深入了解JVM相 ...

  9. Java web 入门知识 及HTTP协议详解

     Java  web  入门知识 及HTTP协议详解 WEB入门 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资 ...

  10. [ 转载 ] Java开发中的23种设计模式详解(转)

    Java开发中的23种设计模式详解(转)   设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类 ...

随机推荐

  1. Houdini_Python笔记

    目录 Gemetry 用Stash节点预览模型 判断文件是否存在 PDG Gemetry 用Stash节点预览模型 import hou stashParm = stashNode.parm(&quo ...

  2. 杭电OJ1029题C++实现

    解题思路:因为要求的数出现的次数总是比其他数字出现的次数多1,所以若总是用相同的数去与其他的数相抵,那么最后只剩下一个,那就是要求的数. 另外需要注意的一点就是,最好不要去开长度为999999的数组, ...

  3. STM32中遇到的一些关键字

    3.在STM32编程中遇到的一些关键字 STM32是基于RAM的架构,学习它可以是嵌入式的一个基础部分.因此对于一些关键字也必须了解,在STM32学习过程中,遇到过如下变量,对其有疑问 关键字 功能 ...

  4. Ubuntu ROOT默认密码设置

    Ubuntu默认密码设置 Ubuntu默认是不设置ROOT密码的,如果需要安装一些包则需要从普通用户调转至ROOT用户,这个时候就需要设置一下密码了. 下面这种情况 chen@chen:~/Deskt ...

  5. JAVA第四五次大作业及期中考试总结

         21201411-李英涵            继承与多态blog2 前言: 期中考试的题目还可以,因为给了类图,但是难度也逐渐升高. pta中的四的第一题和第三题较为简单,因为第一题的正则 ...

  6. 【APT】APT-C-41下载器组件样本分析

    前言 APT-C-41(又被称为蓝色魔眼.Promethium.StrongPity),该APT组织最早的攻击活动可以追溯到2012年.该组织主要针对意大利.土耳其.比利时.叙利亚.欧洲等地区和国家进 ...

  7. ES6 函数的扩展 rest参数

    function add(...values) { let sum = 0; for (var val of values) { sum += val; } return sum; } add(2, ...

  8. Synchronized和Lock有什么区别?用Lock有什么好处?

    Synchronized 和 Lock 1.原始构成 Synchronized 是关键字属于JVM层面 (代码中以蓝色字体呈现) monitorenter .monitorexit Lock 是具体类 ...

  9. Java经典知识复习

    1.自增变量 int i = 1; i = i++; int j = i++; int k = i + ++i * i++; 问i.j.k分别等于? 针对这类题目,   1. 赋值操作=,最后计算: ...

  10. 字符串替换Replace仅替换第一个匹配项

    C#里面的String.Replace(string,string)方法替换的时候是替换所有的匹配项,但是有时候我们会遇到这样的需求,就是只替换第一个匹配项. 我这里自己写另一个方法来实现这个功能,求 ...