詳解Java中switch的新特性
一. switch分支結(jié)構(gòu)
1. 簡介
switch結(jié)合case,能夠判斷一個變量或表達式與一系列值中的某個值是否相等,這里的每個值都被稱為一個分支。switch語句在執(zhí)行時,會先進行值的匹配,匹配成功時會進入到對應(yīng)case語句。再根據(jù)是否有 break語句,判斷是否繼續(xù)輸出,或是跳出當(dāng)前switch判斷。
2. 基本語法
在使用switch之前,首先我們得記住它的基本語法結(jié)構(gòu),其基本語法格式如下:
switch(值){ case 值1: //switch中的值與值1相等時執(zhí)行的代碼 break; //可選 case 值2: //switch中的值與值2相等時執(zhí)行的代碼 break; //可選 case 值3: //switch中的值與值3相等時執(zhí)行的代碼 break; //可選 case 值4: //switch中的值與值4相等時執(zhí)行的代碼 break; //可選 default: //switch中的值與以上所有值都不相等時執(zhí)行的代碼 break; //可選 }
那么這個語法具體有哪些要求呢?請繼續(xù)往下看。
3. 語法規(guī)則(重點)
根據(jù)上面介紹的switch語法結(jié)構(gòu),再給大家詳細說一下switch的語法規(guī)則和要求。
- switch(值)語句中的”值“,支持的類型有如下幾類:
- 整型:byte、short、int 、char及其對應(yīng)的包裝類;
- 枚舉類型,從JDK 5開始支持(后面會詳細講解枚舉類型);
- String類型,從JDK 7開始支持,同時case標(biāo)簽后的值必須是字符串常量或字面量。
- switch后面可以有多個 case 語句,每個 case 后都要跟一個待比較的值和冒號。
- case標(biāo)簽后面值的數(shù)據(jù)類型必須與switch(值)中的數(shù)據(jù)類型相同,且只能是常量或者字面常量。
- 當(dāng)switch(值)的值與 case語句中的值相等時,case標(biāo)簽后面的語句開始執(zhí)行,遇到break標(biāo)簽時停止執(zhí)行switch語句。
- case語句中不一定非要帶有break語句。如果case后沒有 break 語句,程序會繼續(xù)執(zhí)行下一個case 語句,直到出現(xiàn) break 語句,這種現(xiàn)象叫做”case穿透“。
- switch語句中可以包含一個default默認分支,該分支一般是 switch 語句的最后一個分支,當(dāng)switch的值和case語句的值不相等時執(zhí)行。default 分支中不用帶有break 語句,另外該分支可以放在任何位置,但建議寫在最后面。
4. 執(zhí)行邏輯
根據(jù)上面的語法規(guī)則,我們可以結(jié)合下圖來理解switch語句的執(zhí)行邏輯。switch的執(zhí)行邏輯,其實就相當(dāng)于是把多種情況分別列出,根據(jù)我們輸入的值來判斷符合哪種情況。符合哪個情況,就進入到對應(yīng)的分支里面去執(zhí)行,整體的執(zhí)行邏輯就是這樣的,如下圖所示:
了解完這些理論內(nèi)容之后,接下來就給大家設(shè)計幾個switch的案例,我們一起動手實操起來吧。
二. switch案例
1. 基本案例
案例需求:輸入一個序號,代表今天是星期幾,選擇今天要做的事情。
/** * @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("請輸入日期序號,代表今天是星期幾"); 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 語句,當(dāng)switch里的數(shù)值與case匹配成功后,會從當(dāng)前 case 開始,把后續(xù)所有的 case 語句也都執(zhí)行,這種現(xiàn)象叫做case穿透。一般情況下,我們要避免出現(xiàn)case穿透,防止一下執(zhí)行多個語句。但有些時候,我們也可以利用這一特性,故意進行”穿透“。比如有幾種情況的處理策略一樣時,就可以通過”穿透“減少代碼的編寫。
接下來通過一個案例來給大家演示穿透現(xiàn)象。案例需求:選擇A,輸出”優(yōu)秀“;選擇B:輸出”良好“;選擇C:輸出”一般“;選擇D、E等:輸出”很差“,其他情況則默認處理。不區(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("請輸入成績等級"); 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("成績無效"); break; } }
三. switch新特性(了解)
1. 概述
我們知道,在使用switch時有可能會出現(xiàn)”case穿透“現(xiàn)象。如果你遺漏了break語句,有可能會造成嚴重的邏輯錯誤,而且這種錯誤還不太容易在源碼中發(fā)現(xiàn)。所以為了防止意外出現(xiàn)”case穿透“,從JDK 12開始,switch語句升級成了更簡單的表達式語法,使用了一種類似于模式匹配(Pattern Matching)的方式,確保只有一個路徑會被執(zhí)行,而且不再需要我們手動添加break語句。
這一新特性,可以說簡化了不少無效代碼,還規(guī)避了一定的風(fēng)險,簡直不要太贊哦。接下來就給大家設(shè)計幾個案例,說說JDK 12中switch的使用。因為當(dāng)前的JDK版本是JDK 17,可以向下兼容JDK 12,所以我們不用單獨安裝JDK 12哦。
2. 代碼案例
2.1 ->符號
在JDK 12的switch語句中,支持使用 ->符號,當(dāng)然也可以不使用->符號,繼續(xù)采用以前的寫法也沒問題。如果case后面只有一條語句,可以直接在->后面編寫該語句; 如果有多條語句,需要用 {} 括起來。另外在JDK 12的switch語句中,不用再寫 break 語句,新的語法只會執(zhí)行匹配的語句,不會出現(xiàn)”穿透效應(yīng)“。
/** * @author */ public class Demo01 { public static void main(String[] args) { // switch結(jié)構(gòu)-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中返回結(jié)果
在JDK 12中,我們可以把在 switch 語句中把產(chǎn)生的結(jié)果直接返回,不必再使用break語句進行結(jié)束。一般情況下,我們在switch表達式內(nèi)部只會返回簡單的值。但如果你想要處理多個復(fù)雜的語句,其實也可以寫很多語句,這些代碼都要放到放到 {...} 里面,然后使用 yield關(guān)鍵字(以后細講) 進行返回。 配套案例如下:
/** * @author */ public class Demo01 { public static void main(String[] args) { // switch結(jié)構(gòu)-case穿透 System.out.println("請選擇你的國家"); Scanner sc = new Scanner(System.in); String country = sc.next(); // 注意:這里的返回值類型,可以是任意類型。我們后面在學(xué)習(xí)方法時再細說返回值的問題 String result = switch (country) { case "中國" -> "我是中國人,我自豪!"; case "日本" -> "鬼子腳盆雞";// 返回值只能有一個 case "美國" -> { String str = "我們就喜歡以德服人"; // 注意:這里需要返回一個變量?。?! yield str; } default -> "未知國籍,黑戶"; };// 注意:這里需要有個“;”,表示語句的結(jié)束 System.out.println("你的國家情況:" + result); } }
四. 結(jié)語
在本篇文章中,給大家介紹了switch分支結(jié)構(gòu),至此我們就把三大流程控制結(jié)構(gòu)中的分支結(jié)構(gòu)學(xué)習(xí)完畢了。結(jié)合前一篇文章中學(xué)習(xí)的if語句,給大家總結(jié)一下if與switch的異同點。
1. 相同點
- if和switch都是Java里的分支選擇語句,它倆都屬于條件分支語句;
- 很多時候,if和swich可以實現(xiàn)的效果類似。
2. 不同點
- switch結(jié)構(gòu)只能處理等值條件判斷的情況,且條件必須是整型、枚舉變量或字符型變量;
- 多重if選擇結(jié)構(gòu)沒有switch結(jié)構(gòu)的諸多限制,特別適合某個變量處于某個連續(xù)區(qū)間時的情況;
- if比switch應(yīng)用范圍更廣、更靈活。if可以實現(xiàn)的條件判斷,switch不一定能夠?qū)崿F(xiàn);switch可以實現(xiàn)的條件判斷,if肯定可以實現(xiàn)。
- if 在應(yīng)用中更為常見,但switch的結(jié)構(gòu)更清晰。
- switch使用查找表比對的方式,使得case的條件必須是連續(xù)的常量,if語句則沒有這些限制。
- 一般情況下,switch比if-else效率更高。 因為switch內(nèi)部使用了Binary Tree算法,不管有多少個case,都只計算一次值,直接跳轉(zhuǎn),不需逐個比較查詢,除非是if-else的第一個條件就為true。
- switch的效率其實與分支數(shù)無關(guān)。只有當(dāng)分支比較少時,if語句的效率才比switch高,因為switch有跳轉(zhuǎn)表。當(dāng)分支較多時,推薦使用switch語句。
以上就是詳解Java中switch的新特性的詳細內(nèi)容,更多關(guān)于Java switch新特性的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MyBatis-Plus 集成動態(tài)多數(shù)據(jù)源的實現(xiàn)示例
本文主要介紹了MyBatis-Plus 集成動態(tài)多數(shù)據(jù)源的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07SpringBoot項目整合jasypt實現(xiàn)過程詳解
這篇文章主要介紹了SpringBoot項目整合jasypt實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08PowerJob分布式任務(wù)調(diào)度源碼流程解讀
這篇文章主要為大家介紹了PowerJob分布式任務(wù)調(diào)度源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-02-02IDEA 顯示Run Dashboard窗口的2種方式(推薦)
這篇文章主要介紹了IDEA 顯示Run Dashboard窗口的2種方式,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08Java應(yīng)用開源框架實現(xiàn)簡易web搜索引擎
本篇文章主要介紹了Java應(yīng)用開源框架實現(xiàn)簡易web搜索引擎,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11