Switch
switch相较于if条件语句,有其独特之处,所以拿出来溜一下。
语法:
switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//你可以有任意数量的case语句
default : //可选
//语句
break; //可选
}
-
expression:
switch 语句中的变量类型可以是: byte、short、int 或者 char。从JDK1.5 才开始支持枚举类型。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。
其实在Java底层中,switch中的表达式只支持int类型(byte,char,short能够自动转为int)。enum在底层中的存储方式也是int类型。而表达式为字符串时,使用的是其本身的hash值来代替字符串,再使用equals方法比较字符串对象是否一致。如果hash值和equals都一致,才确定了switch选择。
刚学Java时,教材和老师都说switch的表达式只能是int,char这些整型,其实是不完整的。switch的表达式可以是字符(char)类型和整型类型,除了long类型。为什么long被除外呢?我们可以揣测Java开发人员的想法:既然要一个量来做到精确的比较,那么只能使用整型类型,因为浮点类型存在精度问题。接着,既然要使用整型,那么哪些整型可以使用呢?有必要使用long类型吗?long类型的数据范围有264,实际开发中不可能会需要这么多的case,而且int是最常用的整型类型。因此Java底层中,switch只支持int类型。
以上纯胡扯,未来版本也有可能支持long类型。 -
case:
case后的值必须是字面值,切不能出现重复。
-
break:
用于跳出switch语句块。
-
default:
如果所有的case都不满足,则进入default分支。default可以放在switch分支的任意位置(不过通常放在最后)。
注意
-
JVM会从上到下依次匹配case后的值。如果匹配成功,则执行这个case后的所有语句块(包括其他case和default内的),JVM会忽略case,除非遇到break则跳出switch结构,或者到达switch语句末尾而正常跳出。
int i = 2; switch (i) { case 1: System.out.print(1); case 2: //从上往下依次匹配。进入case 2分支 System.out.print(2); case 3: System.out.print(3); //往下顺序执行代码(JVM忽略case),除非遇到break,或switch语句结尾。 default: System.out.print("default"); } //out:23default
int i = 2; switch (i) { case 1: System.out.print(1); break; case 2: //从上往下依次匹配。进入case 2分支 System.out.print(2); break; //跳出swtich语句块,语句块后的代码不再执行 case 3: System.out.print(3); break; default: System.out.print("default"); } //out:2
int i = 4; switch (i) { case 1: System.out.print(1); break; case 2: System.out.print(2); break; case 3: System.out.print(3); break; default: //从上往下依次匹配,如果所有case项都不满足,则进入default System.out.print("default"); } //out:default
int i = 4; switch (i) { default: //从第一个case开始从上往下依次匹配,如果所有case项都不满足,则进入default项 System.out.print("default"); case 1: System.out.print(1); //往下顺序执行 case 2: System.out.print(2); break; //遇到break,跳出switch语句块 case 3: System.out.print(3); break; } //out:default12
-
String类型作为表达式
String str = "B"; switch(str){ case "A": System.out.println("A"); break; case "B": System.out.println("B"); break; case "C": System.out.println("C"); break; default: System.out.println("default"); }
为了让Java功能更强大,
让程序员更省心,switch支持String总算是千呼万唤使出来。有人可能会问,switch底层不是只支持int类型嘛,突然又来个String是什么鬼?我们将上述代码经过反编译后:String str = "B"; byte var3 = -1; switch (str.hashCode()) { case 65: if (str.equals("A")) { var3 = 0; } break; case 66: if (str.equals("B")) { var3 = 1; } break; case 67: if (str.equals("C")) { var3 = 2; } } switch (var3) { case 0: System.out.println("A"); break; case 1: System.out.println("B"); break; case 2: System.out.println("C"); break; default: System.out.println("default"); }
从上可以看到:
当表达式为字符串时,先使用其本身的hash值来代替字符串,再使用equals方法比较字符串对象是否一致。如果hash值和equals都一致,才确定了switch选择,然后执行响应的代码。