我的编程空间,编程开发者的网络收藏夹
学习永远不晚

详解Java中switch的新特性

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详解Java中switch的新特性

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

以上就是详解Java中switch的新特性的详细内容,更多关于Java switch新特性的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

详解Java中switch的新特性

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

详解Java中switch的新特性

这篇文章主要介绍了Java中switch的新特性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-20

JDK12的新特性详解

本篇内容介绍了“JDK12的新特性详解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、JDK12之Shenandoah低暂停时间垃圾收集器
2023-06-02

JDK8的新特性详解

本篇内容介绍了“JDK8的新特性详解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、Lambda演变过程@Data@ToString@No
2023-06-02

JDK 新特性篇:JDK 10 新特性详解

JDK 10 是 Java 开发工具包的一个版本,其中包含了一些新的特性和改进。下面是 JDK 10 的一些新特性的详细解释:1. 局部变量类型推断:JDK 10 引入了局部变量类型推断的功能,使得在声明变量时可以使用 var 关键字代替具
2023-09-14

JDK 新特性篇:JDK 9 新特性详解

JDK 9 是 Java 平台的一次重大更新,引入了许多新的特性和改进。以下是 JDK 9 的一些主要新特性的详细解释。模块化系统(Module System):JDK 9 引入了一个全新的模块化系统,它允许将代码和资源以模块的形式组织和封
2023-09-13

Java8新特性详解

陈老老老板 说明:新的专栏,本专栏专门讲Java8新特性,把平时遇到的问题与Java8的写法进行总结,需要注意的地方都标红了,一起加油。 本文是介绍Java8新特性与常用方法(此篇只做大体介绍了解,之后会把重
2023-08-17

JDK10新特性详解

1、局部变量var 将前端思想var关键字引入java后段,自动检测所属于类型,一种情况除外,不能为null,因为不能判断具体类型,会报异常。@Testpublic void test1(){ var number = 10
2023-06-02

JDK11新特性详解

1、增强局部变量类型推断varConsumer consumer = t -> System.out.println(t.toUpperCase());Consumer consumer = (var t)
2023-06-02

JDK9新特性详解

1、Java9新特性之目录结构 包含jdk8及以前的jdk版本,所有目录结构以及目录含义如图: jdk9之后,目录结构发生变化如图: 这个新特性只要了解下就可以了,这个目录结构是方便为了接下来新特性做
2023-06-02

Tapestry5新特性详解

Tapestry5是一个轻量级的、开源的Java Web框架,它提供了一种简化Web开发的方式。下面是Tapestry5的一些新特性的详解:1. 组件化:Tapestry5采用组件化的开发模式,将页面划分为多个可复用的组件,每个组件都有自己
2023-09-22

在 Java 8 中,Concat Java 有哪些新特性呢?(Java 8中Concat Java的新特性)

在Java8中,ConcatJava引入了一系列令人兴奋的新特性,这些特性极大地增强了Java编程的灵活性和效率。StreamAPI的引入StreamAPI是Java8中ConcatJava的一
在 Java 8 中,Concat Java 有哪些新特性呢?(Java 8中Concat Java的新特性)
Java2024-12-14

Android 7.0新特性详解

谷歌正式在I/O大会现场详细介绍了有关Android 7.0的大量信息。目前,我们已经知道,新一代Android操作系统将支持无缝升级,能够通过Vulkan API来在中低硬件配置设备上实现流 畅.游戏体验以及更多的Emoji表情。不过,A
2022-06-06

Hadoop3.x新特性详解

Hadoop 3.x版本带来了许多新的特性和改进,使其更加强大和高效。以下是Hadoop 3.x的一些主要新特性:HDFS Erasure Coding:Hadoop 3.x引入了HDFS Erasure Coding,这是一种新的数据保护
Hadoop3.x新特性详解
2024-02-29

Go 1.22中的for循环新特性详解

Go1.22引入了for循环新特性,提供了更灵活、简洁的写法。逆序迭代支持逆序遍历集合;并行化允许并行执行迭代;新的子句语法简化了代码。这些特性增强了for循环的灵活性,提高了性能,增强了代码可读性,从而提升了Go编程的效率和易用性。
Go 1.22中的for循环新特性详解
2024-04-02

js中switch语句的特性是什么

这篇文章主要介绍“js中switch语句的特性是什么”,在日常操作中,相信很多人在js中switch语句的特性是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”js中switch语句的特性是什么”的疑惑有所
2023-06-20

Java 10 新特性解读

Java 10 是 JDK 的第十个版本,于 2018 年 3 月发布。Java 10 引入了一些新的特性和改进,下面是对其进行的解读:1. 局部变量类型推断:Java 10 引入了 var 关键字,可以在局部变量的声明中使用。var 关键
2023-09-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录