switch String带来的坑:
有如下代码:
public class SwitchString {
public static void main(String[] args) {
method(null);
}
public static void method(String param) {
switch (param) {
case "sth":
System.out.println("it's sth");
break;
case "null":
System.out.println("it's null");
break;
default:
System.out.println("default");
}
}
}
也许第一反应是会进default,但运行结果是抛出了空指针异常;查看一下编译后的代码就知道原因了,下面是method编译后反编译的代码:
public static void method(String param) {
byte var2 = -1;
switch(param.hashCode()) {
case 114215:
if (param.equals("sth")) {
var2 = 0;
}
break;
case 3392903:
if (param.equals("null")) {
var2 = 1;
}
}
switch(var2) {
case 0:
System.out.println("it's sth");
break;
case 1:
System.out.println("it's null");
break;
default:
System.out.println("default");
}
}
首先,其利用String的hashCode对其进行了一次switch case操作(空指针异常的原因就很明显了),得到一个var,再对var进行switch case;这很容易让人想到hash冲突如何解决?见以下代码:
case 3104:
if (b.equals("aa")) {
var4 = 1;
} else if (b.equals("bB")) {
var4 = 0;
}
使用了if 结合equals来进行操作,正确性得到保证;
总结:
了解了switch对String的处理后,如果case中的选项没有出现大量的hashcode冲突的字符串时,其效率并不会被大幅降低;
switch因为会对其获取hashcode,所以不能传递null,否则会抛出NPE;