java7 switch case支持String, 是jvm支持吗? No,下面有图有真相
先来看一下源码
public void say(String lang) {
switch (lang) {
case "java":
System.out.println("hello java!");
break;
case "scala":
System.out.println("hello scala!");
break;
default:
System.out.println("no match!");
break;
}
}
javap -verbose 反编译后
怎么,看不懂,jad反编译一下class
jad 反编译一下class
public void say(String paramString) {
String str = paramString;
int i = -1;
switch (str.hashCode()) {
case 3254818:
if (str.equals("java"))
i = 0;
break;
case 109250886:
if (str.equals("scala"))
i = 1;
}
switch (i) {
case 0:
System.out.println("hello java!");
break;
case 1:
System.out.println("hello scala!");
break;
default:
System.out.println("no match!");
}
}
明白了吧,然来是定义一个int变量,来进行二次转化,首先根据字符串的hashcode来进行switch,匹配hashcode之后再判断equals,相等则对上面那个int变量赋一个值,依次分别为0,1,2,3….,然后再对这个int变量进行switch,匹配上了则执行原来String case时定义代码段。