switch只能比较数值或字符,不过别以为这样它就没有if有用,使用适当的话,它可比if判断式有效率。switch的语法结构如下:
switch(变量名称或表达式) {
case 符合数字或字符:
语句一;
break;
case 符合数字或字符:
语句二;
break;
default:
语句三;
}
首先看看switch的括号,当中放置您要取出数值的变量。取出数值之后,程序会开始与case中所设定的数字或字符做比较,如果符合就执行其中的语句,直到遇到break后离开switch程序块;如果没有符合的数值或字符,则会执行default后的语句,default不一定需要;如果没有默认要处理的动作,可以省去这个部分。
下面来看看范例3.26的成绩等级比较如何使用switch来改写。
? 范例3.27 ScoreLevel2.java
import java.util.Scanner;
public class ScoreLevel2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入分数: ");
int score = scanner.nextInt();
int level = (int) score/10;
switch(level) {
case 10:
case 9:
System.out.println("得A");
break;
case 8:
System.out.println("得B");
break;
case 7:
System.out.println("得C");
break;
case 6:
System.out.println("得D");
break;
default:
System.out.println("得E(不及格)");
}
}
}
在这个程序中,使用除法并取得运算后的商数,如果大于90,除以10的商数一定是9或10(100分时)。在case 10中没有任何的语句,也没有使用break,所以会继续往下执行,直到遇到break离开switch为止,所以若学生成绩为100分,也会显示A的成绩等级;如果比较的条件不是10~6这些值,会执行default下的语句,这表示商数小于6,所以学生的成绩等级就显示为E了。
注意在case后的等号是冒号而不是分号,这是一个经常输错的符号。如果比较的是字符,则记得加上单引号(' ')。例如:
case 'A':
这个程序与使用if来判断成绩等级的程序有何不同?如果纯粹比较数字或字符,建议使用switch,因为它只会在一开始的 switch括号中取出变量值一次,然后将这个值与下面所设定的case比较,但如果使用if,每次遇到条件式时,都要取出变量值,效率的差异就在这儿。例如:
if(a == 1)
// ...
else if(a == 2)
// ...
else if(a == 3)
// ...
这个程序片段在最差的状况下,也就是a = 3时,共需3次比较,而每次比较都必须取出变量a的值一次。如果换成switch:
switch(a) {
case 1:
// ...
break;
case 2:
// ...
break;
case 3:
// ...
break;
}
在这个程序片段中,只在开头switch的括号中取出变量a的值,然后逐一比较下面的case,效率的差别就在这儿。当然并不是使用if就不好,遇到复合条件时,switch就帮不上忙了,由于无法在switch中组合复杂的条件语句,这时就得使用if了。简单地说,if与switch两者可以搭配着灵活使用。