Java?switch?case語(yǔ)句舉例詳解
前言
if…else 語(yǔ)句可以用來(lái)描述一個(gè)“二岔路口”,我們只能選擇其中一條路來(lái)繼續(xù)走,然而生活中經(jīng)常會(huì)碰到“多岔路口”的情況。switch 語(yǔ)句提供了 if 語(yǔ)句的一個(gè)變通形式,可以從多個(gè)語(yǔ)句塊中選擇其中的一個(gè)執(zhí)行。
switch 語(yǔ)句格式
switch 語(yǔ)句是 Java 的多路分支語(yǔ)句。它提供了一種基于一個(gè)表達(dá)式的值來(lái)使程序執(zhí)行不同部分的簡(jiǎn)單方法。因此,它提供了一個(gè)比一系列 if-else-if 語(yǔ)句更好的選擇。
switch 語(yǔ)句的基本語(yǔ)法形式如下所示:
switch(表達(dá)式){
case 值1:
語(yǔ)句塊1;
break;
case 值2:
語(yǔ)句塊2;
break;
…
case 值n:
語(yǔ)句塊n;
break;
default:
語(yǔ)句塊n+1;
break;
}其中,switch、case、default、break 都是 Java 的關(guān)鍵字。
1)switch
表示“開(kāi)關(guān)”,這個(gè)開(kāi)關(guān)就是 switch 關(guān)鍵字后面小括號(hào)里的值,小括號(hào)里要放一個(gè)整型變量或字符型變量。表達(dá)式必須為 byte,short,int,char類型。
Java7 增強(qiáng)了 switch 語(yǔ)句的功能,允許 switch 語(yǔ)句的控制表達(dá)式是 java.lang.String 類型的變量或表達(dá)式。只能是 java.lang.String 類型,不能是 StringBuffer 或 StringBuilder 這兩種字符串的類型。
2)case
表示“情況,情形”,case 標(biāo)簽可以是:
類型為 char、byte、 short 或 int 的常量表達(dá)式。
枚舉常量。
從 Java SE 7 開(kāi)始, case 標(biāo)簽還可以是字符串字面量。
例如:
String input =...;
switch(input.toLowerCase()){// toLowerCase用于將大寫(xiě)字符轉(zhuǎn)換為小寫(xiě)
case"yes":
...
break;
}當(dāng)在 switch 語(yǔ)句中使用枚舉常量時(shí),不必在每個(gè)標(biāo)簽中指明枚舉名,可以由 switch 的表達(dá)式值確定。例如:
Size sz =...;
switch(sz){
case SMALL:// no need to use Size.SMALL
...
break;
...
}注意:重復(fù)的 case 值是不允許的。
3)default
表示“默認(rèn)”,即其他情況都不滿足。default 后要緊跟冒號(hào),default 塊和 case 塊的先后順序可以變動(dòng),不會(huì)影響程序執(zhí)行結(jié)果。通常,default 塊放在末尾,也可以省略不寫(xiě)。
4)break
表示“停止”,即跳出當(dāng)前結(jié)構(gòu)。
如果在 case 分支語(yǔ)句的末尾沒(méi)有 break 語(yǔ)句,有可能觸發(fā)多個(gè) case 分支。那么就會(huì)接著執(zhí)行下一個(gè) case 分支語(yǔ)句。這種情況相當(dāng)危險(xiǎn),常常會(huì)引發(fā)錯(cuò)誤。為此,我們?cè)诔绦蛑袕牟皇褂?switch 語(yǔ)句。
如果你喜歡 switch 語(yǔ)句,編譯代碼時(shí)可以考慮加上 -Xlint:fallthrough 選項(xiàng),如下所示:
javac -Xlint:fallthrough Test.java
這樣一來(lái),如果某個(gè)分支最后缺少一個(gè) break 語(yǔ)句,編譯器就會(huì)給出一個(gè)警告消息。
switch 語(yǔ)句的執(zhí)行過(guò)程如下:表達(dá)式的值與每個(gè) case 語(yǔ)句中的常量作比較。如果發(fā)現(xiàn)了一個(gè)與之相匹配的,則執(zhí)行該 case 語(yǔ)句后的代碼。如果沒(méi)有一個(gè) case 常量與表達(dá)式的值相匹配,則執(zhí)行 default 語(yǔ)句。當(dāng)然,default 語(yǔ)句是可選的。如果沒(méi)有相匹配的 case 語(yǔ)句,也沒(méi)有 default 語(yǔ)句,則什么也不執(zhí)行。

圖 1 switch語(yǔ)句執(zhí)行流程圖
例 1
在節(jié)目的抽獎(jiǎng)環(huán)節(jié)里,節(jié)目組會(huì)根據(jù)每位嘉賓的座位號(hào)來(lái)進(jìn)行抽獎(jiǎng)游戲,根據(jù)不同的號(hào)碼來(lái)決定獎(jiǎng)項(xiàng)的大小。使用 switch 語(yǔ)句編寫(xiě) Java 程序來(lái)完成獎(jiǎng)項(xiàng)分配,其實(shí)現(xiàn)代碼如下。
publicstaticvoidmain(String[] args){
System.out.println("請(qǐng)輸入座位號(hào)碼:");
Scanner sc =newScanner(System.in);
int num = sc.nextInt();
switch(num){
case8:
System.out.println("恭喜你,獲得了三等獎(jiǎng)!");
break;
case88:
System.out.println("恭喜你,獲得了二等獎(jiǎng)!");
break;
case888:
System.out.println("恭喜你,獲得了一等獎(jiǎng)!");
break;
default:
System.out.println("謝謝參與!");
break;
}
}當(dāng)用戶輸入的號(hào)碼為 888 時(shí),獲取的 num 值為 888,則與第三個(gè) case 后的值匹配,執(zhí)行它后面的語(yǔ)句,輸出“恭喜你,獲得了一等獎(jiǎng)!”,然后執(zhí)行 break 語(yǔ)句,跳出整個(gè) switch 結(jié)構(gòu)。如果輸入的號(hào)碼與 case 中的值都不匹配,則執(zhí)行 default 后的語(yǔ)句。
程序執(zhí)行結(jié)果如下所示:
請(qǐng)輸入座位號(hào)碼:
888
恭喜你,獲得了一等獎(jiǎng)!
請(qǐng)輸入座位號(hào)碼:
88
恭喜你,獲得了二等獎(jiǎng)!
請(qǐng)輸入座位號(hào)碼:
66
謝謝參與!
例 2
編寫(xiě)一個(gè) Java 程序,根據(jù)當(dāng)前的星期數(shù)字輸出對(duì)應(yīng)的漢字。在這里使用包含 break 的 switch 語(yǔ)句來(lái)判斷當(dāng)前的星期,實(shí)現(xiàn)代碼如下:
publicstaticvoidmain(String[] args){
String weekDate ="";
Calendar calendar = Calendar.getInstance();// 獲取當(dāng)前時(shí)間
int week = calendar.get(Calendar.DAY_OF_WEEK)-1;// 獲取星期的第幾日
switch(week){
case0:
weekDate ="星期日";
break;
case1:
weekDate ="星期一";
break;
case2:
weekDate ="星期二";
break;
case3:
weekDate ="星期三";
break;
case4:
weekDate ="星期四";
break;
case5:
weekDate ="星期五";
break;
case6:
weekDate ="星期六";
break;
}
System.out.println("今天是 "+ weekDate);
}本程序首先獲取當(dāng)前的星期值,然后使用 switch 語(yǔ)句判斷 week 的值:0 表示星期日,1 表示星期一,2 表示星期二……以此類推,6 表示星期六。只要 week 值與 case 值相符合,則程序?qū)?zhí)行該 case 中的語(yǔ)句,并跳出 switch 語(yǔ)句,輸出結(jié)果。
運(yùn)行程序,輸出的結(jié)果如下:
今天是星期五
嵌套 switch 語(yǔ)句
可以將一個(gè) switch 語(yǔ)句作為一個(gè)外部 switch 語(yǔ)句的語(yǔ)句序列的一部分,這稱為嵌套 switch 語(yǔ)句。因?yàn)橐粋€(gè) switch 語(yǔ)句定義了自己的塊,外部 switch 語(yǔ)句和內(nèi)部 switch 語(yǔ)句的 case 常量不會(huì)產(chǎn)生沖突。例如,下面的程序段是完全正確的:
publicstaticvoidmain(String[] args){
switch(count){
case1:
switch(target){
case0:
System.out.println("target is zero");
break;
case1:
System.out.println("target is one");
break;
}
break;
case2:// ...
}
}本例中,內(nèi)部 switch 語(yǔ)句中的case 1:語(yǔ)句與外部 switch 語(yǔ)句中的case 1:語(yǔ)句不沖突。變量 count 僅與外層的 case 語(yǔ)句相比較。如果變量 count 為 1,則變量 target 與內(nèi)層的 case 語(yǔ)句相比較。
學(xué)到這里我們可以發(fā)現(xiàn)以下幾點(diǎn):
switch 語(yǔ)句不同于 if 語(yǔ)句的是 switch 語(yǔ)句僅能測(cè)試相等的情況,而 if 語(yǔ)句可計(jì)算任何類型的布爾表達(dá)式。也就是 switch 語(yǔ)句只能尋找 case 常量間某個(gè)值與表達(dá)式的值相匹配。
在同一個(gè) switch 語(yǔ)句中沒(méi)有兩個(gè)相同的 case 常量。當(dāng)然,外部 switch 語(yǔ)句中的 case 常量可以和內(nèi)部 switch 語(yǔ)句中的 case 常量相同。
switch 語(yǔ)句通常比一系列嵌套 if 語(yǔ)句更有效。
最后一點(diǎn)尤其有趣,因?yàn)樗刮覀冎?Java 編譯器如何工作。當(dāng)編譯一個(gè) switch 語(yǔ)句時(shí),Java 編譯器將檢查每個(gè) case 常量并且創(chuàng)造一個(gè)“跳轉(zhuǎn)表”,這個(gè)表將用來(lái)在表達(dá)式值的基礎(chǔ)上選擇執(zhí)行路徑。因此,如果你需要在一組值中做出選擇,switch 語(yǔ)句將比與之等效的 if-else 語(yǔ)句快得多。
編譯器可以這樣做是因?yàn)樗?case 常量都是同類型的,所要做的只是將它與 switch 表達(dá)式相比較看是否相等。對(duì)于一系列的 if 表達(dá)式,編譯器就無(wú)此功能。
if 語(yǔ)句和 switch 語(yǔ)句的區(qū)別
if 和 switch 語(yǔ)句都表示條件語(yǔ)句,可以從使用效率和實(shí)用性兩方面加以區(qū)分。
1. 從使用效率上區(qū)分
從使用效率上區(qū)分,在對(duì)同一個(gè)變量的不同值作條件判斷時(shí),既可以使用 switch 語(yǔ)句,也可以使用 if 語(yǔ)句。使用 switch 語(yǔ)句的效率更高一些,尤其是判斷的分支越多,越明顯。
2. 從實(shí)用性上區(qū)分
從語(yǔ)句的實(shí)用性角度區(qū)分,switch 語(yǔ)句不如 if 條件語(yǔ)句,if 語(yǔ)句是應(yīng)用最廣泛和最實(shí)用的語(yǔ)句。
3. 何時(shí)使用 if 語(yǔ)句和 switch 語(yǔ)句
在程序開(kāi)發(fā)的過(guò)程中,何時(shí)使用 if 語(yǔ)句和 switch 語(yǔ)句,需要根據(jù)實(shí)際情況而定,應(yīng)盡量做到物盡其用。不能因?yàn)?switch 語(yǔ)句的效率高就一直使用,也不能因?yàn)?if 語(yǔ)句常用就不用 switch 語(yǔ)句。需要根據(jù)實(shí)際情況,具體問(wèn)題具體分析,使用最適合的條件語(yǔ)句。
一般情況下,對(duì)于判斷條件較少的,可以使用 if 條件語(yǔ)句,但是在實(shí)現(xiàn)一些多條件的判斷中,最好使用 switch 語(yǔ)句。
總結(jié)
到此這篇關(guān)于Java switch case語(yǔ)句的文章就介紹到這了,更多相關(guān)Java switch case語(yǔ)句內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決跨域請(qǐng)求,NG返回403(403并不一定是NG問(wèn)題)
這篇文章主要介紹了解決跨域請(qǐng)求,NG返回403(403并不一定是NG問(wèn)題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
java時(shí)間 java.util.Calendar深入分析
這篇文章主要介紹了java時(shí)間 java.util.Calendar深入分析的相關(guān)資料,需要的朋友可以參考下2017-02-02
Spring?Security過(guò)濾器鏈體系的實(shí)例詳解
這篇文章主要介紹了Spring?Security過(guò)濾器鏈體系,通過(guò)思維導(dǎo)圖可以很好的幫助大家理解配置類的相關(guān)知識(shí),結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02
如何解決mybatis查詢結(jié)果接收不同的問(wèn)題
這篇文章主要介紹了如何解決mybatis查詢結(jié)果接收不同的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
springboot整合ACTable生成數(shù)據(jù)庫(kù)表方式
ACTable是一個(gè)增強(qiáng)Mybatis的功能框架,支持SpringBoot和SpringMvc項(xiàng)目,通過(guò)配置model注解即可創(chuàng)建、修改表結(jié)構(gòu),并實(shí)現(xiàn)了共通的CRUD功能2025-02-02
java模擬http的Get/Post請(qǐng)求,并設(shè)置ip與port代理的方法
下面小編就為大家?guī)?lái)一篇java模擬http的Get/Post請(qǐng)求,并設(shè)置ip與port代理的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02

