java中switch條件語句的三種語法、用法及支持的參數(shù)類型
一、switch的應(yīng)用場景
在分支結(jié)構(gòu)中,我們除了使用if-else或者是if-else if之外,當(dāng)分支量過大的時(shí)候,我們即可選擇使用switch語句進(jìn)行選擇
二、switch三種語法
Java中switch的三種用法詳解:
- switch 標(biāo)準(zhǔn)方式
- switch - > 用法
- switch yield 用法
2.1、switch 標(biāo)準(zhǔn)方式
語法:
switch (表達(dá)式) { case 值1: // 執(zhí)行語句塊1 break; case 值2: // 執(zhí)行語句塊2 break; ... case 值N: // 執(zhí)行語句塊N break; default: // 如果以上所有case都不匹配,執(zhí)行默認(rèn)語句塊 }
case語句中指定的每個(gè)值必須具有與表達(dá)式兼容的類型。switch語句的執(zhí)行順序是,首先計(jì)算表達(dá)式的值,然后將該值與每個(gè)case的值進(jìn)行比較,如果找到匹配的case,則執(zhí)行該case下的語句,直到遇到break語句或switch語句結(jié)束
。如果沒有找到匹配的case,且存在default子句,則執(zhí)行default子句中的語句。如果沒有匹配的case且沒有default子句,程序?qū)⒉粓?zhí)行任何操作。
注意:若表達(dá)式的值與case后面的值匹配則會(huì)執(zhí)行該case下的語句,但是若該case下沒有break,則會(huì)一直往下執(zhí)行,直到遇到break語句或switch語句結(jié)束
注意
1.表達(dá)式支持的參數(shù)類型:JDK1.0-1.4 數(shù)據(jù)類型接受 byte、short、int、char
JDK1.5 數(shù)據(jù)類型接受 byte、short、int、char、enum(枚舉)、(包裝類型Character、Byte、Short、Integer)
JDK1.7 數(shù)據(jù)類型接受 byte、short、int、char、enum(枚舉)、包裝類型、String 六種類型
(1)對四個(gè)包裝類的支持是因?yàn)閖ava編譯器在底層手動(dòng)進(jìn)行拆箱。
(2)而對枚舉類的支持是因?yàn)槊杜e類有一個(gè)ordinal方法,該方法實(shí)際上是一個(gè)int類型的數(shù)值。
(3)jdk1.7開始支持String類型,但實(shí)際上String類型有一個(gè)hashCode算法,結(jié)果也是int類型。
(4)而byte short char類型可以在不損失精度的情況下向上轉(zhuǎn)型成int類型.所以總的來說,可以認(rèn)為switch中只支持int類型。
float、double都不能用于switch語句。
2.default 子句是可選的,當(dāng)沒有匹配的 case 時(shí),執(zhí)行default3.break語句用來在執(zhí)行完一個(gè) case 分支后使程序跳出 switch 語句塊;如果沒有寫 break,程序會(huì)順序執(zhí)行到 switch 結(jié)尾,除非遇到break。
2.2、switch - > 用法
jdk12開始switch語法支持函數(shù)式接口和lambda表達(dá)式
使用switch標(biāo)準(zhǔn)方式編寫代碼太多的break造成代碼冗余可讀性不高 可以借助函數(shù)式接口和lambda表達(dá)式簡化書寫
代碼如下:
switch (表達(dá)式) { case 值1 -> 執(zhí)行語句塊1; case 值2 -> 執(zhí)行語句塊2; ...... case 值N -> 執(zhí)行語句塊N; default: // 如果以上所有case都不匹配,執(zhí)行默認(rèn)語句塊 }
使用 - > 方法更加簡單, ->的用法其實(shí)只是相當(dāng)于不用輸入break就可以跳出判斷, 保證其只有一條分支可走.
示例:
int dayOfWeek = 2; switch (dayOfWeek) { case 1 -> System.out.println("星期一"); case 2 -> System.out.println("星期二"); case 3 -> System.out.println("星期三"); case 4 -> System.out.println("星期四"); case 5 -> System.out.println("星期五"); case 6 -> System.out.println("星期六"); default -> System.out.println("星期日"); }
輸出結(jié)果為:
星期二
jdk12之后還可以多條件合并
int dayOfWeek = 2; switch (dayOfWeek) { case 1,2,3,4,5 -> System.out.println("工作日"); default -> System.out.println("其他"); }
2.2、switch yield 用法
jdk14新特性,增加了yield用法
int numLetters = switch(seasonName){ case "Spring" ->{ System.out.println("spring time"); yield 6; } case "Summer","Winter" -> 6; //可以使用yield關(guān)鍵字,也可以省略 case "Fall" -> 4; default -> -1; };
這里來說, switch 作為了 一條語句, 所以末尾要加冒號
, 其他用法相同
示例:
int dayOfWeek = 2; String weekday = switch (dayOfWeek) { case 1: yield "星期一"; case 2: yield "星期二"; case 3: yield "星期三"; case 4: yield "星期四"; case 5: yield "星期五"; case 6: yield "星期六"; default: yield "星期日"; }; System.out.println(weekday);
三、什么是case穿透?
在java的switch非簡化語句中,當(dāng)匹配到的case中沒加break;的時(shí)候,那就會(huì)執(zhí)行當(dāng)前case里面的語句,以及這個(gè)switch語句中當(dāng)前case下面的所有case中或者是default中的語句。直到遇到break;為止
以下是有關(guān)case穿透的實(shí)驗(yàn)代碼:
public static void main(String[] args) { String date = "周二"; switch(date){ case "周一": System.out.println("周一"); case "周二": System.out.println("周二"); case "周三": System.out.println("周三"); default: System.out.println("其他"); } }
輸出周二、周三、其他
四、示例
4.1、標(biāo)準(zhǔn)示例
public static void main(String[] args) { String date = "周一"; switch(date){ case "周一": System.out.println("工作日"); break; case "周二": System.out.println("工作日"); break; case "周三": System.out.println("工作日"); break; default: System.out.println("其他"); break; } }
4.2、錯(cuò)誤示例
由于switch語句中整體都沒加break, 所以語句會(huì)在遇到第一個(gè)符合的case開始執(zhí)行,直到遇到break或switch語句結(jié)束
public static void main(String[] args) { String date = "周二"; switch(date){ case "周一": System.out.println("周一"); case "周二": System.out.println("周二"); case "周三": System.out.println("周三"); default: System.out.println("其他"); } }
輸出周二、周三、其他
4.3、引申用法(多條件合并)
上面寫的案例感覺很多邏輯重復(fù)的,能否多個(gè)條件合并在一起呢?當(dāng)然是可以的
方式一:
public static void main(String[] args) { String date = "周一"; switch(date){ case "周一": case "周二": case "周三": System.out.println("工作日"); break; default: System.out.println("其他"); break; } }
由于case "周一"后面沒有跟break;所以會(huì)一直走下去,直到遇到break。因此可以利用這種方式實(shí)現(xiàn)少些代碼。
方式二:java14引入
注意:此種方式需要jdk版本是jdk14及以上
public static void main(String[] args) { String date = "周一"; switch(date){ case "周一","周二","周三": System.out.println("工作日"); break; default: System.out.println("其他"); break; } }
總結(jié)
到此這篇關(guān)于java中switch條件語句的三種語法、用法及支持的參數(shù)類型的文章就介紹到這了,更多相關(guān)java switch條件語句用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring AOP的底層實(shí)現(xiàn)方式-代理模式
這篇文章主要介紹了Spring AOP的底層實(shí)現(xiàn)方式-代理模式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11springMVC?@RestControllerAdvice注解使用方式
這篇文章主要介紹了springMVC?@RestControllerAdvice注解使用方式,下面通過一個(gè)簡單的示例,演示如何使用?@RestControllerAdvice,感興趣的朋友跟隨小編一起看看吧2024-08-08idea環(huán)境下Maven無法正常下載pom中配置的包問題
這篇文章主要介紹了idea環(huán)境下Maven無法正常下載pom中配置的包的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06說說字符串轉(zhuǎn) OffSetDateTime 你真的會(huì)用嗎
這篇文章主要介紹了字符串轉(zhuǎn) OffSetDateTime 你真的會(huì)用嗎?具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08java8 LocalDate LocalDateTime等時(shí)間類用法實(shí)例分析
這篇文章主要介紹了java8 LocalDate LocalDateTime等時(shí)間類用法,結(jié)合具體實(shí)例形式分析了LocalDate、LocalTime、LocalDateTime等日期時(shí)間相關(guān)類的功能與具體使用技巧,需要的朋友可以參考下2017-04-04