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");
}
}
}
也許第一反應(yīng)是會進default,但運行結(jié)果是拋出了空指針異常蹋半;查看一下編譯后的代碼就知道原因了他巨,下面是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 結(jié)合equals來進行操作份企,正確性得到保證;
總結(jié):
了解了switch對String的處理后巡莹,如果case中的選項沒有出現(xiàn)大量的hashcode沖突的字符串時司志,其效率并不會被大幅降低;
switch因為會對其獲取hashcode榕莺,所以不能傳遞null俐芯,否則會拋出NPE;