java中switch條件語(yǔ)句的三種語(yǔ)法、用法及支持的參數(shù)類(lèi)型
一、switch的應(yīng)用場(chǎng)景
在分支結(jié)構(gòu)中,我們除了使用if-else或者是if-else if之外,當(dāng)分支量過(guò)大的時(shí)候,我們即可選擇使用switch語(yǔ)句進(jìn)行選擇

二、switch三種語(yǔ)法
Java中switch的三種用法詳解:
- switch 標(biāo)準(zhǔn)方式
- switch - > 用法
- switch yield 用法
2.1、switch 標(biāo)準(zhǔn)方式
語(yǔ)法:
switch (表達(dá)式) {
case 值1:
// 執(zhí)行語(yǔ)句塊1
break;
case 值2:
// 執(zhí)行語(yǔ)句塊2
break;
...
case 值N:
// 執(zhí)行語(yǔ)句塊N
break;
default:
// 如果以上所有case都不匹配,執(zhí)行默認(rèn)語(yǔ)句塊
}
case語(yǔ)句中指定的每個(gè)值必須具有與表達(dá)式兼容的類(lèi)型。switch語(yǔ)句的執(zhí)行順序是,首先計(jì)算表達(dá)式的值,然后將該值與每個(gè)case的值進(jìn)行比較,如果找到匹配的case,則執(zhí)行該case下的語(yǔ)句,直到遇到break語(yǔ)句或switch語(yǔ)句結(jié)束。如果沒(méi)有找到匹配的case,且存在default子句,則執(zhí)行default子句中的語(yǔ)句。如果沒(méi)有匹配的case且沒(méi)有default子句,程序?qū)⒉粓?zhí)行任何操作。
注意:若表達(dá)式的值與case后面的值匹配則會(huì)執(zhí)行該case下的語(yǔ)句,但是若該case下沒(méi)有break,則會(huì)一直往下執(zhí)行,直到遇到break語(yǔ)句或switch語(yǔ)句結(jié)束
注意
1.表達(dá)式支持的參數(shù)類(lèi)型:JDK1.0-1.4 數(shù)據(jù)類(lèi)型接受 byte、short、int、char
JDK1.5 數(shù)據(jù)類(lèi)型接受 byte、short、int、char、enum(枚舉)、(包裝類(lèi)型Character、Byte、Short、Integer)
JDK1.7 數(shù)據(jù)類(lèi)型接受 byte、short、int、char、enum(枚舉)、包裝類(lèi)型、String 六種類(lèi)型
(1)對(duì)四個(gè)包裝類(lèi)的支持是因?yàn)閖ava編譯器在底層手動(dòng)進(jìn)行拆箱。
(2)而對(duì)枚舉類(lèi)的支持是因?yàn)槊杜e類(lèi)有一個(gè)ordinal方法,該方法實(shí)際上是一個(gè)int類(lèi)型的數(shù)值。
(3)jdk1.7開(kāi)始支持String類(lèi)型,但實(shí)際上String類(lèi)型有一個(gè)hashCode算法,結(jié)果也是int類(lèi)型。
(4)而byte short char類(lèi)型可以在不損失精度的情況下向上轉(zhuǎn)型成int類(lèi)型.所以總的來(lái)說(shuō),可以認(rèn)為switch中只支持int類(lèi)型。
float、double都不能用于switch語(yǔ)句。
2.default 子句是可選的,當(dāng)沒(méi)有匹配的 case 時(shí),執(zhí)行default3.break語(yǔ)句用來(lái)在執(zhí)行完一個(gè) case 分支后使程序跳出 switch 語(yǔ)句塊;如果沒(méi)有寫(xiě) break,程序會(huì)順序執(zhí)行到 switch 結(jié)尾,除非遇到break。
2.2、switch - > 用法
jdk12開(kāi)始switch語(yǔ)法支持函數(shù)式接口和lambda表達(dá)式
使用switch標(biāo)準(zhǔn)方式編寫(xiě)代碼太多的break造成代碼冗余可讀性不高 可以借助函數(shù)式接口和lambda表達(dá)式簡(jiǎn)化書(shū)寫(xiě)
代碼如下:
switch (表達(dá)式) {
case 值1 -> 執(zhí)行語(yǔ)句塊1;
case 值2 -> 執(zhí)行語(yǔ)句塊2;
......
case 值N -> 執(zhí)行語(yǔ)句塊N;
default:
// 如果以上所有case都不匹配,執(zhí)行默認(rèn)語(yǔ)句塊
}
使用 - > 方法更加簡(jiǎ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;
};
這里來(lái)說(shuō), switch 作為了 一條語(yǔ)句, 所以末尾要加冒號(hào), 其他用法相同
示例:
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非簡(jiǎn)化語(yǔ)句中,當(dāng)匹配到的case中沒(méi)加break;的時(shí)候,那就會(huì)執(zhí)行當(dāng)前case里面的語(yǔ)句,以及這個(gè)switch語(yǔ)句中當(dāng)前case下面的所有case中或者是default中的語(yǔ)句。直到遇到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語(yǔ)句中整體都沒(méi)加break, 所以語(yǔ)句會(huì)在遇到第一個(gè)符合的case開(kāi)始執(zhí)行,直到遇到break或switch語(yǔ)句結(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、引申用法(多條件合并)
上面寫(xiě)的案例感覺(jué)很多邏輯重復(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 "周一"后面沒(méi)有跟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條件語(yǔ)句的三種語(yǔ)法、用法及支持的參數(shù)類(lèi)型的文章就介紹到這了,更多相關(guān)java switch條件語(yǔ)句用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)屏幕共享功能實(shí)例分析
這篇文章主要介紹了java實(shí)現(xiàn)屏幕共享功能的方法,以實(shí)例形式分析了屏幕共享功能的客戶端與服務(wù)端的詳細(xì)實(shí)現(xiàn)方法,是非常具有實(shí)用價(jià)值的技巧,需要的朋友可以參考下2014-12-12
一文教你使用Java?Calendar類(lèi)進(jìn)行日期計(jì)算
在日常開(kāi)發(fā)中,我們常常需要進(jìn)行日期計(jì)算,比如計(jì)算兩個(gè)日期之間的天數(shù)、月數(shù),在Java中,我們可以使用Java?Calendar類(lèi)來(lái)進(jìn)行日期計(jì)算,下面就跟隨小編一起來(lái)學(xué)習(xí)一下吧2023-10-10
SpringBoot實(shí)戰(zhàn)記錄之?dāng)?shù)據(jù)訪問(wèn)
對(duì)于數(shù)據(jù)訪問(wèn)層,無(wú)論是SQL還是NOSQL,Spring Boot默認(rèn)采用整合Spring Data的方式進(jìn)行統(tǒng)一處理,添加大量自動(dòng)配置,屏蔽了很多設(shè)置,下面這篇文章主要介紹了SpringBoot實(shí)戰(zhàn)記錄之?dāng)?shù)據(jù)訪問(wèn),需要的朋友可以參考下2022-04-04
SpringBoot解析@Value注解型解析注入時(shí)機(jī)及原理分析
@Value注解可以用來(lái)將外部的值動(dòng)態(tài)注入到Bean中,可以獲取配置文件中的屬性值和通過(guò)SpEl表達(dá)式獲取bean的屬性或方法2024-12-12
MyBatisCodeHelperPro插件下載及使用教程詳解
這篇文章主要介紹了MyBatis CodeHelperPro插件使用教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-09-09
SpringBoot與GraphQL集成的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot與GraphQL集成的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-04-04
java類(lèi)實(shí)現(xiàn)日期的時(shí)間差的實(shí)例講解
在本篇文章里小編給大家整理的是一篇關(guān)于java類(lèi)實(shí)現(xiàn)日期的時(shí)間差的實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-01-01
Java執(zhí)行SQL腳本文件到數(shù)據(jù)庫(kù)詳解
這篇文章主要為大家詳細(xì)介紹了Java執(zhí)行SQL腳本文件到數(shù)據(jù)庫(kù)的相關(guān)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Java多線程鎖機(jī)制相關(guān)原理實(shí)例解析
這篇文章主要介紹了Java多線程鎖機(jī)制相關(guān)原理實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
java代理 jdk動(dòng)態(tài)代理應(yīng)用案列
java代理有jdk動(dòng)態(tài)代理、cglib代理,這里只說(shuō)下jdk動(dòng)態(tài)代理,jdk動(dòng)態(tài)代理主要使用的是java反射機(jī)制,需要了解的朋友可以參考下2012-11-11

