Java-Switch语句解析
[常规Swith语句]
//: VowelsAndConsonants.java
// Demonstrates the switch statement
public class VowelsAndConsonants {
public static void main(String[] args) {
for(int i = 0; i < 100; i++) {
char c = (char)(Math.random() * 26 + 'a');
System.out.print(c + ": ");
switch (c) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
System.out.println("vowel");
break;
case 'y':
case 'w':
System.out.println("Sometimes a vowel");
break;
default:
System.out.println("consonant");
}
}
}
}
应特别留意这个语句:
char c = (char)(Math.random() * 26 + 'a');
Math.random()会产生一个double值,所以26会转换成double类型,以便执行乘法运算。这个运算也会产生一个double值。这意味着为了执行加法,必须无将'a'转换成一个double。利用一个“造型”,double结果会转换回char。
造型会对char作什么样的处理呢?换言之,假设一个值是29.7,我们把它造型成一个char,结果值是30。在将一个float或double值造型成整数值后,是将小数部分直接“砍掉”,不作任何进位处理。
[无Break语句情况]
public static void main(String[] args) {
int a=5;
int s=0;
switch(a)
{
case 5:
s += 1;
case 9:
s += 3;
case 8:
s += 5;
default:
s += 10;
break;
}
System.out.print(s);
}
结果:19
因没有break;故程序执行s += 1;s += 3;s += 5;s += 10;应注意的是,default中的语句也被执行了。
[非常规的default位置]
public class B {
public static void main(String Args[]){
int i =1 ,j =0;
switch(i)
{
default:j+=2;
case 2:j+=6;
case 4:j+=6;
case 0:j+=4;
}
System.out.println(j);
}
}
结果为18。i=1,case语句无相符条目,故执行default。default语句无break,故实际执行为:j+=2;j+=6;j+=6;j+=4;——由此得j=18。
若i=2,则实际执行为:j+=6;j+=6;j+=4;——最终结果为j=16。
[Java中switch比elseif效率高的原因]
if语句适用范围比较广,只要是boolean表达式都可以用if判断;而switch只能对基本类型进行数值比较。两者的可比性就仅限在两个基本类型比较的范围内。
说到基本类型的数值比较,那当然要有两个数。if 语句每一句都是独立的,看下面的语句:
if (a == 1) {...}
else if (a == 2) {...}
这样a要被读入寄存器两次,1和2分别被读入寄存器一次。其实a读两次是有点多余的,在全部比较完之前只需要一次读入寄存器就行了,其余都是额外开销。但是if语句必须每次都把里面的两个数从内存拿出来读到寄存器,它不知道你其实比较的是同一个a。
现在把上面的例子改成 switch case 版本:
switch (a) {
case 0:
break;
case 1:
}
因为特定的规则,他一开始就知道你要比 a,于是 a 一次性读取,相比 if 节约了很多开销。