欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java中switch的新特性

 更新時(shí)間:2023年05月15日 10:09:43   作者:一一哥Sun  
這篇文章主要介紹了Java中switch的新特性,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一. switch分支結(jié)構(gòu)

1. 簡(jiǎn)介

switch結(jié)合case,能夠判斷一個(gè)變量或表達(dá)式與一系列值中的某個(gè)值是否相等,這里的每個(gè)值都被稱為一個(gè)分支。switch語(yǔ)句在執(zhí)行時(shí),會(huì)先進(jìn)行值的匹配,匹配成功時(shí)會(huì)進(jìn)入到對(duì)應(yīng)case語(yǔ)句。再根據(jù)是否有 break語(yǔ)句,判斷是否繼續(xù)輸出,或是跳出當(dāng)前switch判斷。

2. 基本語(yǔ)法

在使用switch之前,首先我們得記住它的基本語(yǔ)法結(jié)構(gòu),其基本語(yǔ)法格式如下:

switch(值){ 
    case 值1: 
        //switch中的值與值1相等時(shí)執(zhí)行的代碼 
      break; //可選
    case 值2: 
        //switch中的值與值2相等時(shí)執(zhí)行的代碼 
      break; //可選
    case 值3: 
        //switch中的值與值3相等時(shí)執(zhí)行的代碼 
      break; //可選
    case 值4: 
        //switch中的值與值4相等時(shí)執(zhí)行的代碼 
      break; //可選
    default: 
        //switch中的值與以上所有值都不相等時(shí)執(zhí)行的代碼 
      break; //可選
}

那么這個(gè)語(yǔ)法具體有哪些要求呢?請(qǐng)繼續(xù)往下看。

3. 語(yǔ)法規(guī)則(重點(diǎn))

根據(jù)上面介紹的switch語(yǔ)法結(jié)構(gòu),再給大家詳細(xì)說(shuō)一下switch的語(yǔ)法規(guī)則和要求。

  • switch(值)語(yǔ)句中的”值“,支持的類型有如下幾類:
    • 整型:byte、short、int 、char及其對(duì)應(yīng)的包裝類;
    • 枚舉類型,從JDK 5開始支持(后面會(huì)詳細(xì)講解枚舉類型);
    • String類型,從JDK 7開始支持,同時(shí)case標(biāo)簽后的值必須是字符串常量或字面量。
  • switch后面可以有多個(gè) case 語(yǔ)句,每個(gè) case 后都要跟一個(gè)待比較的值和冒號(hào)。
  • case標(biāo)簽后面值的數(shù)據(jù)類型必須與switch(值)中的數(shù)據(jù)類型相同,且只能是常量或者字面常量。
  • 當(dāng)switch(值)的值與 case語(yǔ)句中的值相等時(shí),case標(biāo)簽后面的語(yǔ)句開始執(zhí)行,遇到break標(biāo)簽時(shí)停止執(zhí)行switch語(yǔ)句。
  • case語(yǔ)句中不一定非要帶有break語(yǔ)句。如果case后沒(méi)有 break 語(yǔ)句,程序會(huì)繼續(xù)執(zhí)行下一個(gè)case 語(yǔ)句,直到出現(xiàn) break 語(yǔ)句,這種現(xiàn)象叫做”case穿透“。
  • switch語(yǔ)句中可以包含一個(gè)default默認(rèn)分支,該分支一般是 switch 語(yǔ)句的最后一個(gè)分支,當(dāng)switch的值和case語(yǔ)句的值不相等時(shí)執(zhí)行。default 分支中不用帶有break 語(yǔ)句,另外該分支可以放在任何位置,但建議寫在最后面。

4. 執(zhí)行邏輯

根據(jù)上面的語(yǔ)法規(guī)則,我們可以結(jié)合下圖來(lái)理解switch語(yǔ)句的執(zhí)行邏輯。switch的執(zhí)行邏輯,其實(shí)就相當(dāng)于是把多種情況分別列出,根據(jù)我們輸入的值來(lái)判斷符合哪種情況。符合哪個(gè)情況,就進(jìn)入到對(duì)應(yīng)的分支里面去執(zhí)行,整體的執(zhí)行邏輯就是這樣的,如下圖所示:

了解完這些理論內(nèi)容之后,接下來(lái)就給大家設(shè)計(jì)幾個(gè)switch的案例,我們一起動(dòng)手實(shí)操起來(lái)吧。

二. switch案例

1. 基本案例

案例需求:輸入一個(gè)序號(hào),代表今天是星期幾,選擇今天要做的事情。

/**
 * @author 
 */
public class Demo01 {

    public static void main(String[] args) {
	// switch結(jié)構(gòu)
	Scanner sc=new Scanner(System.in);
		
	//根據(jù)輸入的數(shù)字,選擇每天要做的事情
	System.out.println("請(qǐng)輸入日期序號(hào),代表今天是星期幾");
	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穿透

在前面給大家講過(guò),如果 case 語(yǔ)句中沒(méi)有 break 語(yǔ)句,當(dāng)switch里的數(shù)值與case匹配成功后,會(huì)從當(dāng)前 case 開始,把后續(xù)所有的 case 語(yǔ)句也都執(zhí)行,這種現(xiàn)象叫做case穿透。一般情況下,我們要避免出現(xiàn)case穿透,防止一下執(zhí)行多個(gè)語(yǔ)句。但有些時(shí)候,我們也可以利用這一特性,故意進(jìn)行”穿透“。比如有幾種情況的處理策略一樣時(shí),就可以通過(guò)”穿透“減少代碼的編寫。

接下來(lái)通過(guò)一個(gè)案例來(lái)給大家演示穿透現(xiàn)象。案例需求:選擇A,輸出”優(yōu)秀“;選擇B:輸出”良好“;選擇C:輸出”一般“;選擇D、E等:輸出”很差“,其他情況則默認(rèn)處理。不區(qū)分大小寫,即選擇A和a是一樣的結(jié)果。

/**
 * @author
 */
public class Demo01 {

    public static void main(String[] args) {
	// switch結(jié)構(gòu)-case穿透
	Scanner sc=new Scanner(System.in);
        
	// 根據(jù)輸入的數(shù)字,選擇每天要做的事情
	System.out.println("請(qǐng)輸入成績(jī)等級(jí)");
	String level = sc.next();
	switch (level) {
            case "a":
            case "A":
                System.out.println("優(yōu)秀");
                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("成績(jī)無(wú)效");
                break;
    }
}

三. switch新特性(了解)

1. 概述

我們知道,在使用switch時(shí)有可能會(huì)出現(xiàn)”case穿透“現(xiàn)象。如果你遺漏了break語(yǔ)句,有可能會(huì)造成嚴(yán)重的邏輯錯(cuò)誤,而且這種錯(cuò)誤還不太容易在源碼中發(fā)現(xiàn)。所以為了防止意外出現(xiàn)”case穿透“,從JDK 12開始,switch語(yǔ)句升級(jí)成了更簡(jiǎn)單的表達(dá)式語(yǔ)法,使用了一種類似于模式匹配(Pattern Matching)的方式,確保只有一個(gè)路徑會(huì)被執(zhí)行,而且不再需要我們手動(dòng)添加break語(yǔ)句。

這一新特性,可以說(shuō)簡(jiǎn)化了不少無(wú)效代碼,還規(guī)避了一定的風(fēng)險(xiǎn),簡(jiǎn)直不要太贊哦。接下來(lái)就給大家設(shè)計(jì)幾個(gè)案例,說(shuō)說(shuō)JDK 12中switch的使用。因?yàn)楫?dāng)前的JDK版本是JDK 17,可以向下兼容JDK 12,所以我們不用單獨(dú)安裝JDK 12哦。

2. 代碼案例

2.1 ->符號(hào)

在JDK 12的switch語(yǔ)句中,支持使用 ->符號(hào),當(dāng)然也可以不使用->符號(hào),繼續(xù)采用以前的寫法也沒(méi)問(wèn)題。如果case后面只有一條語(yǔ)句,可以直接在->后面編寫該語(yǔ)句; 如果有多條語(yǔ)句,需要用 {} 括起來(lái)。另外在JDK 12的switch語(yǔ)句中,不用再寫 break 語(yǔ)句,新的語(yǔ)法只會(huì)執(zhí)行匹配的語(yǔ)句,不會(huì)出現(xiàn)”穿透效應(yīng)“。

/**
 * @author
 */
public class Demo01 {

    public static void main(String[] args) {
	// switch結(jié)構(gòu)-case穿透
	System.out.println("請(qǐng)選擇你的國(guó)家");

	Scanner sc = new Scanner(System.in);
	String country = sc.next();
	switch (country) {
            case "中國(guó)" -> System.out.println("我是中國(guó)人,我自豪!");
            case "日本" -> System.out.println("鬼子腳盆雞");
            case "美國(guó)" -> {
                System.out.println("暫時(shí)還是老大");
                System.out.println("喜歡欺負(fù)人");
            }
            default -> System.out.println("未知國(guó)籍,黑戶");
	}
    }
}

2.2 switch中返回結(jié)果

在JDK 12中,我們可以把在 switch 語(yǔ)句中把產(chǎn)生的結(jié)果直接返回,不必再使用break語(yǔ)句進(jìn)行結(jié)束。一般情況下,我們?cè)趕witch表達(dá)式內(nèi)部只會(huì)返回簡(jiǎn)單的值。但如果你想要處理多個(gè)復(fù)雜的語(yǔ)句,其實(shí)也可以寫很多語(yǔ)句,這些代碼都要放到放到 {...} 里面,然后使用 yield關(guān)鍵字(以后細(xì)講) 進(jìn)行返回。 配套案例如下:

/**
 * @author
 */
public class Demo01 {

    public static void main(String[] args) {
	// switch結(jié)構(gòu)-case穿透
	System.out.println("請(qǐng)選擇你的國(guó)家");

	Scanner sc = new Scanner(System.in);
	String country = sc.next();

	// 注意:這里的返回值類型,可以是任意類型。我們后面在學(xué)習(xí)方法時(shí)再細(xì)說(shuō)返回值的問(wèn)題
	String result = switch (country) {
            case "中國(guó)" -> "我是中國(guó)人,我自豪!";
            case "日本" -> "鬼子腳盆雞";// 返回值只能有一個(gè)
            case "美國(guó)" -> {
                String str = "我們就喜歡以德服人";
                // 注意:這里需要返回一個(gè)變量!??!
                yield str;
            }
            default -> "未知國(guó)籍,黑戶";
	};// 注意:這里需要有個(gè)“;”,表示語(yǔ)句的結(jié)束

	System.out.println("你的國(guó)家情況:" + result);
    }
}

四. 結(jié)語(yǔ)

在本篇文章中,給大家介紹了switch分支結(jié)構(gòu),至此我們就把三大流程控制結(jié)構(gòu)中的分支結(jié)構(gòu)學(xué)習(xí)完畢了。結(jié)合前一篇文章中學(xué)習(xí)的if語(yǔ)句,給大家總結(jié)一下if與switch的異同點(diǎn)。

1. 相同點(diǎn)

  • if和switch都是Java里的分支選擇語(yǔ)句,它倆都屬于條件分支語(yǔ)句;
  • 很多時(shí)候,if和swich可以實(shí)現(xiàn)的效果類似。

2. 不同點(diǎn)

  • switch結(jié)構(gòu)只能處理等值條件判斷的情況,且條件必須是整型、枚舉變量或字符型變量;
  • 多重if選擇結(jié)構(gòu)沒(méi)有switch結(jié)構(gòu)的諸多限制,特別適合某個(gè)變量處于某個(gè)連續(xù)區(qū)間時(shí)的情況;
  • if比switch應(yīng)用范圍更廣、更靈活。if可以實(shí)現(xiàn)的條件判斷,switch不一定能夠?qū)崿F(xiàn);switch可以實(shí)現(xiàn)的條件判斷,if肯定可以實(shí)現(xiàn)。
  • if 在應(yīng)用中更為常見,但switch的結(jié)構(gòu)更清晰。
  • switch使用查找表比對(duì)的方式,使得case的條件必須是連續(xù)的常量,if語(yǔ)句則沒(méi)有這些限制。
  • 一般情況下,switch比if-else效率更高。 因?yàn)閟witch內(nèi)部使用了Binary Tree算法,不管有多少個(gè)case,都只計(jì)算一次值,直接跳轉(zhuǎn),不需逐個(gè)比較查詢,除非是if-else的第一個(gè)條件就為true。
  • switch的效率其實(shí)與分支數(shù)無(wú)關(guān)。只有當(dāng)分支比較少時(shí),if語(yǔ)句的效率才比switch高,因?yàn)閟witch有跳轉(zhuǎn)表。當(dāng)分支較多時(shí),推薦使用switch語(yǔ)句。

以上就是詳解Java中switch的新特性的詳細(xì)內(nèi)容,更多關(guān)于Java switch新特性的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MyBatis-Plus 集成動(dòng)態(tài)多數(shù)據(jù)源的實(shí)現(xiàn)示例

    MyBatis-Plus 集成動(dòng)態(tài)多數(shù)據(jù)源的實(shí)現(xiàn)示例

    本文主要介紹了MyBatis-Plus 集成動(dòng)態(tài)多數(shù)據(jù)源的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • SpringBoot項(xiàng)目整合jasypt實(shí)現(xiàn)過(guò)程詳解

    SpringBoot項(xiàng)目整合jasypt實(shí)現(xiàn)過(guò)程詳解

    這篇文章主要介紹了SpringBoot項(xiàng)目整合jasypt實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • PowerJob分布式任務(wù)調(diào)度源碼流程解讀

    PowerJob分布式任務(wù)調(diào)度源碼流程解讀

    這篇文章主要為大家介紹了PowerJob分布式任務(wù)調(diào)度源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-02-02
  • 對(duì)spring task和線程池的深入研究

    對(duì)spring task和線程池的深入研究

    這篇文章主要介紹了對(duì)spring task和線程池的深入研究,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java api返回值的標(biāo)準(zhǔn)化詳解

    java api返回值的標(biāo)準(zhǔn)化詳解

    這篇文章主要介紹了java api返回值的標(biāo)準(zhǔn)化詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java Web用戶登錄實(shí)例代碼

    Java Web用戶登錄實(shí)例代碼

    這篇文章主要介紹了Java Web用戶登錄實(shí)例代碼的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-05-05
  • IDEA 顯示Run Dashboard窗口的2種方式(推薦)

    IDEA 顯示Run Dashboard窗口的2種方式(推薦)

    這篇文章主要介紹了IDEA 顯示Run Dashboard窗口的2種方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java應(yīng)用開源框架實(shí)現(xiàn)簡(jiǎn)易web搜索引擎

    Java應(yīng)用開源框架實(shí)現(xiàn)簡(jiǎn)易web搜索引擎

    本篇文章主要介紹了Java應(yīng)用開源框架實(shí)現(xiàn)簡(jiǎn)易web搜索引擎,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • JPA配置方式+逆向工程映射到Entity實(shí)體類

    JPA配置方式+逆向工程映射到Entity實(shí)體類

    這篇文章主要介紹了JPA配置方式+逆向工程映射到Entity實(shí)體類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • JavaCV 拉流存儲(chǔ)到本地示例解析

    JavaCV 拉流存儲(chǔ)到本地示例解析

    這篇文章主要介紹了JavaCV 拉流存儲(chǔ)到本地示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08

最新評(píng)論