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

news2025/3/12 23:59:28

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

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.coloradmin.cn/o/413484.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WebSocket和Socket编程

面试一般会问 socket原理 socket为啥要有端口:确定一个链路的是一个四元组 Socket编程 socket通信 你做过socket编程吗,socket是怎么实现知道有连接过来的 说说WebSocket与socket的区别 先谈谈Websocket与Socket的区别 首先Socket 不属于协议范畴 &a…

处理用户输入

shell脚本编程系列 传递参数 向shell脚本传递数据的最简单方法是使用命令行参数 比如 ./add 10 30读取参数 bash shell会将所有的命令行参数都指派给位置参数的特殊变量。其中$0对应脚本名、$1是第一个参数、$2是第二个参数,依次类推,直到$9 #!/bin/b…

Unity3D打包WebGL并使用MQTT(二):使用json

Unity3D打包WebGL并使用MQTT(二):使用json 1. 软件环境 Unity: 2021.3stomp.js 2.3.3: 下载地址:https://www.jsdelivr.com/package/npm/stompjs 2. 内容介绍 这篇博客的主要内容是记录将一个Unity项目打包成WebGL项目,并集成MQTT进行json数据传输的过程。 3. …

〖Python网络爬虫实战⑬〗- XPATH实战案例

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付费…

一篇文章理解堆栈溢出

一篇文章理解堆栈溢出引言栈溢出ret2text答案ret2shellcode答案ret2syscall答案栈迁移答案堆溢出 unlink - UAF堆结构小提示向前合并/向后合并堆溢出题答案引言 让新手快速理解堆栈溢出,尽可能写的简单一些。 栈溢出 代码执行到进入函数之前都会记录返回地址到SP…

wsl区分和切换,安装NVIDIA驱动+cuda+ffmpeg

wsl区分和切换,安装NVIDIA驱动cudaffmpeg 安装Nvidia驱动 打开terminal wsl --update进入wsl nvidia-smi网上找了一些博客,获取信息: window安装好驱动即可wsl有1和2 我的win10已经安装了驱动 wsl1和wsl怎么区分?切换 区分…

实时聊天提示的最佳做法

本文将教您更多关于有效的实时聊天功能对您的品牌的重要性,以及您可以使用的一些最佳实践来确保您的实时聊天功能尽可能好。实时聊天提示是为您的网站访问者显示的自动聊天消息。在SaleSmartly(ss客服)中,如您将聊天插件安装到您的…

Win10 安装 MongoDB 5.0.16

一、MongoDB 的官方:http://www.mongodb.com/ 下载:​ ​https://www.mongodb.com/download-center/community​ 二、下载msi文件,双击该文件进行安装。 (1)打开对话框 ,单击“Next” (2)请勾…

总结815

4月(复习完高数18讲内容,背诵21篇短文,熟词僻义300词基础词) 4.8 英语:早上继续背昨天没背完的第15篇文章单词,感觉效率极高,可能是昨晚睡眠质量特别好。下午抄写第16篇文章每日一句长难句看《…

Meetup 直播预告|助力企业数字化转型,8 大微服务容器开源实践亮点抢先看

随着数字化、智能化发展趋势不断加快,大中小型企业纷纷将企业“上云”提上日程,推动企业数字化转型。云时代下,企业需要新技术架构,使之更好地利用云计算优势,让业务更敏捷、成本更低、可伸缩性更强,云原生…

进程概念详解

目录 进程是什么? 描述进程:进程控制块-PCB task_struct task_struct 是什么? task_struct内容分类 组织进程 查看进程 fork创建子进程 进程状态 僵尸进程 孤儿进程 进程优先级 其他概念 进程是什么? 一般书上…

【微信小程序】父子组件之间传值

微信小程序父子组件之间传值有两种: 1.父组件向子组件传值 2.子组件向父组件传值 区别: 父向子传值使用的是属性绑定,子组件中的properties对象进行接收父组件传递过来的值。子向父传值使用的是自定义事件,父组件通过自定义事件…

VUE 学习笔记(一)开发环境搭建

1、Visual Studio Code安装及使用 下载地址官网:https://code.visualstudio.com/ 直接点击下载按钮即可,会根据系统自动下载合适的版本,无需自行选择。 2、VSCode 上安装:JavaScript Debugger 目前 Debugger for Chrome 已经处…

基于html+css的盒子内容旋转

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

【目标检测论文阅读笔记】Reducing Label Noise in Anchor-Free Object Detection

(Augmentation for small object detection) Abstract 当前的 anchor-free无锚目标检测器 将空间上落在真值框预定义中心区域内的所有特征标记为正。这种方法会在训练过程中产生 标签噪声,因为这些 正标记的特征中的一些 可能位于背景或遮挡…

2023最新8个电脑必装软件,新电脑装完好用又高效

新买的笔记本电脑到手了,需要安装什么软件?不会真的有人这样问吧,万一真的有人不知道需要安装什么软件呢?好吧,提醒一下各位,新电脑不要乱安装软件啊,不然电脑很容易中病毒的。根据我多次换电脑…

MyBatis配置文件 —— 相关标签详解

目录 一、Mybatis配置文件 — properties标签 二、Mybatis配置文件 — settings标签 三、Mybatis配置文件 — plugins标签 四、Mybatis配置文件 — typeAliases标签 五、Mybatis配置文件 — environments标签 六、Mybatis配置文件 — mappers标签 一、Mybatis配置文件 —…

burp抓包https链接不安全解决方法

在浏览器已经导入Burpsuite的证书之后,抓包,浏览器仍然显示抓取https包提示不是私密链接解决方法 适用于没有继续访问的按钮。 方法一: 浏览器输入 chrome://flags 搜索 Allow invalid certificates for resources loaded from localhost.翻译过来就是 允许从本地主机加载资…

2023 年十大目标检测模型!

2023 年十大目标检测模型! 使用深度学习革新对象检测的综合指南。 对象检测示例 “目标检测是计算机视觉中最令人兴奋和最具挑战性的问题之一,而深度学习已成为解决它的强大工具。” 对象检测是计算机视觉中的一项基本任务,涉及识别和定位…

SpringBoot与RabbitMQ 集成以及死信队列,TTL,延迟队列

简单示例 项目结构依赖配置生产者消费者 消息的可靠投递示例 confirmreturn 消费者确认机制消费端限流TTL 单条消息整个队列设置 TTL 死信队列 死信队列的实现步骤 延迟队列消息幂等设计 简单示例 项目结构 依赖 <dependencies><dependency><groupId>org.…