Java?switch?case語句舉例詳解
前言
if…else 語句可以用來描述一個“二岔路口”,我們只能選擇其中一條路來繼續(xù)走,然而生活中經(jīng)常會碰到“多岔路口”的情況。switch 語句提供了 if 語句的一個變通形式,可以從多個語句塊中選擇其中的一個執(zhí)行。
switch 語句格式
switch 語句是 Java 的多路分支語句。它提供了一種基于一個表達(dá)式的值來使程序執(zhí)行不同部分的簡單方法。因此,它提供了一個比一系列 if-else-if 語句更好的選擇。
switch 語句的基本語法形式如下所示:
switch(表達(dá)式){ case 值1: 語句塊1; break; case 值2: 語句塊2; break; … case 值n: 語句塊n; break; default: 語句塊n+1; break; }
其中,switch、case、default、break 都是 Java 的關(guān)鍵字。
1)switch
表示“開關(guān)”,這個開關(guān)就是 switch 關(guān)鍵字后面小括號里的值,小括號里要放一個整型變量或字符型變量。表達(dá)式必須為 byte,short,int,char類型。
Java7 增強了 switch 語句的功能,允許 switch 語句的控制表達(dá)式是 java.lang.String 類型的變量或表達(dá)式。只能是 java.lang.String 類型,不能是 StringBuffer 或 StringBuilder 這兩種字符串的類型。
2)case
表示“情況,情形”,case 標(biāo)簽可以是:
類型為 char、byte、 short 或 int 的常量表達(dá)式。
枚舉常量。
從 Java SE 7 開始, case 標(biāo)簽還可以是字符串字面量。
例如:
String input =...; switch(input.toLowerCase()){// toLowerCase用于將大寫字符轉(zhuǎn)換為小寫 case"yes": ... break; }
當(dāng)在 switch 語句中使用枚舉常量時,不必在每個標(biāo)簽中指明枚舉名,可以由 switch 的表達(dá)式值確定。例如:
Size sz =...; switch(sz){ case SMALL:// no need to use Size.SMALL ... break; ... }
注意:重復(fù)的 case 值是不允許的。
3)default
表示“默認(rèn)”,即其他情況都不滿足。default 后要緊跟冒號,default 塊和 case 塊的先后順序可以變動,不會影響程序執(zhí)行結(jié)果。通常,default 塊放在末尾,也可以省略不寫。
4)break
表示“停止”,即跳出當(dāng)前結(jié)構(gòu)。
如果在 case 分支語句的末尾沒有 break 語句,有可能觸發(fā)多個 case 分支。那么就會接著執(zhí)行下一個 case 分支語句。這種情況相當(dāng)危險,常常會引發(fā)錯誤。為此,我們在程序中從不使用 switch 語句。
如果你喜歡 switch 語句,編譯代碼時可以考慮加上 -Xlint:fallthrough 選項,如下所示:
javac -Xlint:fallthrough Test.java
這樣一來,如果某個分支最后缺少一個 break 語句,編譯器就會給出一個警告消息。
switch 語句的執(zhí)行過程如下:表達(dá)式的值與每個 case 語句中的常量作比較。如果發(fā)現(xiàn)了一個與之相匹配的,則執(zhí)行該 case 語句后的代碼。如果沒有一個 case 常量與表達(dá)式的值相匹配,則執(zhí)行 default 語句。當(dāng)然,default 語句是可選的。如果沒有相匹配的 case 語句,也沒有 default 語句,則什么也不執(zhí)行。
圖 1 switch語句執(zhí)行流程圖
例 1
在節(jié)目的抽獎環(huán)節(jié)里,節(jié)目組會根據(jù)每位嘉賓的座位號來進(jìn)行抽獎游戲,根據(jù)不同的號碼來決定獎項的大小。使用 switch 語句編寫 Java 程序來完成獎項分配,其實現(xiàn)代碼如下。
publicstaticvoidmain(String[] args){ System.out.println("請輸入座位號碼:"); Scanner sc =newScanner(System.in); int num = sc.nextInt(); switch(num){ case8: System.out.println("恭喜你,獲得了三等獎!"); break; case88: System.out.println("恭喜你,獲得了二等獎!"); break; case888: System.out.println("恭喜你,獲得了一等獎!"); break; default: System.out.println("謝謝參與!"); break; } }
當(dāng)用戶輸入的號碼為 888 時,獲取的 num 值為 888,則與第三個 case 后的值匹配,執(zhí)行它后面的語句,輸出“恭喜你,獲得了一等獎!”,然后執(zhí)行 break 語句,跳出整個 switch 結(jié)構(gòu)。如果輸入的號碼與 case 中的值都不匹配,則執(zhí)行 default 后的語句。
程序執(zhí)行結(jié)果如下所示:
請輸入座位號碼:
888
恭喜你,獲得了一等獎!
請輸入座位號碼:
88
恭喜你,獲得了二等獎!
請輸入座位號碼:
66
謝謝參與!
例 2
編寫一個 Java 程序,根據(jù)當(dāng)前的星期數(shù)字輸出對應(yīng)的漢字。在這里使用包含 break 的 switch 語句來判斷當(dāng)前的星期,實現(xiàn)代碼如下:
publicstaticvoidmain(String[] args){ String weekDate =""; Calendar calendar = Calendar.getInstance();// 獲取當(dāng)前時間 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 語句判斷 week 的值:0 表示星期日,1 表示星期一,2 表示星期二……以此類推,6 表示星期六。只要 week 值與 case 值相符合,則程序?qū)?zhí)行該 case 中的語句,并跳出 switch 語句,輸出結(jié)果。
運行程序,輸出的結(jié)果如下:
今天是星期五
嵌套 switch 語句
可以將一個 switch 語句作為一個外部 switch 語句的語句序列的一部分,這稱為嵌套 switch 語句。因為一個 switch 語句定義了自己的塊,外部 switch 語句和內(nèi)部 switch 語句的 case 常量不會產(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 語句中的case 1:語句與外部 switch 語句中的case 1:語句不沖突。變量 count 僅與外層的 case 語句相比較。如果變量 count 為 1,則變量 target 與內(nèi)層的 case 語句相比較。
學(xué)到這里我們可以發(fā)現(xiàn)以下幾點:
switch 語句不同于 if 語句的是 switch 語句僅能測試相等的情況,而 if 語句可計算任何類型的布爾表達(dá)式。也就是 switch 語句只能尋找 case 常量間某個值與表達(dá)式的值相匹配。
在同一個 switch 語句中沒有兩個相同的 case 常量。當(dāng)然,外部 switch 語句中的 case 常量可以和內(nèi)部 switch 語句中的 case 常量相同。
switch 語句通常比一系列嵌套 if 語句更有效。
最后一點尤其有趣,因為它使我們知道 Java 編譯器如何工作。當(dāng)編譯一個 switch 語句時,Java 編譯器將檢查每個 case 常量并且創(chuàng)造一個“跳轉(zhuǎn)表”,這個表將用來在表達(dá)式值的基礎(chǔ)上選擇執(zhí)行路徑。因此,如果你需要在一組值中做出選擇,switch 語句將比與之等效的 if-else 語句快得多。
編譯器可以這樣做是因為它知道 case 常量都是同類型的,所要做的只是將它與 switch 表達(dá)式相比較看是否相等。對于一系列的 if 表達(dá)式,編譯器就無此功能。
if 語句和 switch 語句的區(qū)別
if 和 switch 語句都表示條件語句,可以從使用效率和實用性兩方面加以區(qū)分。
1. 從使用效率上區(qū)分
從使用效率上區(qū)分,在對同一個變量的不同值作條件判斷時,既可以使用 switch 語句,也可以使用 if 語句。使用 switch 語句的效率更高一些,尤其是判斷的分支越多,越明顯。
2. 從實用性上區(qū)分
從語句的實用性角度區(qū)分,switch 語句不如 if 條件語句,if 語句是應(yīng)用最廣泛和最實用的語句。
3. 何時使用 if 語句和 switch 語句
在程序開發(fā)的過程中,何時使用 if 語句和 switch 語句,需要根據(jù)實際情況而定,應(yīng)盡量做到物盡其用。不能因為 switch 語句的效率高就一直使用,也不能因為 if 語句常用就不用 switch 語句。需要根據(jù)實際情況,具體問題具體分析,使用最適合的條件語句。
一般情況下,對于判斷條件較少的,可以使用 if 條件語句,但是在實現(xiàn)一些多條件的判斷中,最好使用 switch 語句。
總結(jié)
到此這篇關(guān)于Java switch case語句的文章就介紹到這了,更多相關(guān)Java switch case語句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot整合ACTable生成數(shù)據(jù)庫表方式
ACTable是一個增強Mybatis的功能框架,支持SpringBoot和SpringMvc項目,通過配置model注解即可創(chuàng)建、修改表結(jié)構(gòu),并實現(xiàn)了共通的CRUD功能2025-02-02java模擬http的Get/Post請求,并設(shè)置ip與port代理的方法
下面小編就為大家?guī)硪黄猨ava模擬http的Get/Post請求,并設(shè)置ip與port代理的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02