switch語句和if語句一樣,都屬于選擇語句(分支語句),不再贅述,我們直接來看一下一個比較完整的switch語句結構是怎樣的,請看下圖:
圖6-8:switch語句完整結構
switch運行原理是怎樣的呢,請看下圖:
圖6-9:switch語句運行原理圖
switch運行原理文字性描述是這樣的(以上圖為例):拿著c和表達式1進行比較,如果相等,則執行語句1,如果不相等,繼續拿著c和表達式2進行比較,如果相等,則執行語句2,如果不相等,繼續...,如果c和所有的分支表達式都不相等,此時default分支“語句n+1”則執行。
以上描述是switch語句的一般性執行流程,實際上在執行過程中還有很多因素的影響,接下來我將列出使用switch語句的一些注意事項:
● switch語句后面的小括號“()”當中都可以出現什么,在JDK1.6之前(包括1.6在內)switch只能探測int類型的數據,但是在JDK1.7之后(包括1.7在內),switch語句除了支持int類型之外,還支持String類型。也就是說從Java7開始switch后面小括號中可以出現字符串。
● switch雖然只能探測int類型,但是也可以將byte,short,char類型放到小括號當中,因為這些類型會自動轉換成int類型(小容量向大容量轉換稱為自動類型轉換)。
● switch語句當中case是可以進行合并的,例如以下代碼:
switch(90){
case 100 : case 90 : case 80 : case 70 :
System.out.println("過關了");
break;
case 60:
System.out.println("失敗了");
break;
default :
System.out.println("出錯了");
}
● switch語句當中當某個分支匹配成功,則開始執行此分支當中的java語句,當遇到當前分支中的“break;”語句,switch語句就結束了,但是如果當前分支中沒有“break;”語句,則會發生case穿透現象,也就是說下一個分支也不再進行匹配,直接進入下一個分支執行,直到遇到“break;”為止。例如以下代碼:
char c = 'A';
switch(c){
case 'A' :
System.out.println(1);
case 'B' :
System.out.println(2);
break;
default :
System.out.println(3);
}
執行結果如下所示:
圖6-10:switch的case穿透測試
接下來我們來看幾個switch的經典案例,請看代碼:
示例代碼1:從鍵盤接收一個數字[1-7],當數字是1~5的時候,控制臺輸出工作日,當數字是6~7的時候,控制臺輸出休息日,其他數字提示錯誤信息。
java.util.Scanner scan = new java.util.Scanner(System.in);
System.out.print("請輸入[1-7]的整數數字:");
int dayOfWeek = scan.nextInt();
switch(dayOfWeek){
case 1: case 2: case 3: case 4: case 5:
System.out.println("今天是工作日哦!");
break;
case 6:case 7:
System.out.println("今天是休息日哦!");
break;
default :
System.out.println("對不起,您的輸入有誤");
}
示例代碼2:業務背景:鍵盤接收一個學生的成績(假設成績是合法的),范圍在[0-100],根據成績判斷等級,[90-100]等級為“優秀”,[80-90)等級為“良好”,[70-80)等級為“中等”,[60-70)等級為“及格”,[0-60)等級為“大笨蛋”。只允許使用switch,不允許使用if語句。
java.util.Scanner scan = new java.util.Scanner(System.in);
System.out.print("請輸入考試成績[0-100]:");
double score = scan.nextDouble();
String grade = "大笨蛋";
switch((int)(score / 10)){
case 10: case 9:
grade = "優秀";
break;
case 8:
grade = "良好";
break;
case 7:
grade = "中等";
break;
case 6:
grade = "及格";
break;
}
System.out.println("成績等級為:" + grade);
運行結果如下圖所示:
圖6-11:switch判斷成績等級
圖6-12:switch判斷成績等級
以上程序在編寫時候的核心技巧是:[90-100]分的所有數字,包括浮點型數字,讓其除以10之后強轉為int類型,結果一定是9或者10。[80-90)分的所有數字,除以10之后取整,結果一定是8,以此類推。沒關系同學們,大家在起初學習的時候不一定會馬上寫出來以上程序,這個過程是需要積累的,下去之后先自己模仿我的程序,慢慢的你就會寫了。
if和switch都是條件判斷語句(分支語句/選擇語句),在效果上是沒有什么差別的。而不同,我們可以從效率上來看一看,舉一個很簡單的例子: if(a > b) { a = b;} else { b = a; } 如果將這個例子放在switch語句中,也并不是不能實現,但是實現起來可能會比較麻煩一些,因為在switch語句中case要求的是常量,一般是不能進行邏輯判斷的,所以這也是if語句優于switch語句的地方。但是如果您判斷的都是幾個常量的數據,我建議您最好采用switch語句,雖然if語句也是能實現的,但是性能就比switch差的有點遠了。