有一天,小A的朋友小呼面试回来,愁眉不展。
"难道面试不顺利?"小A心想。于是问小呼都问了什么。小呼说,面试官问了个奇怪的问题,
"Java的switch能不能判断string"
小呼当时就内心一喜,这不是明摆着的问题嘛!
"当然可以,java7就可以了"
"那它是怎么实现的呢"
"这个…没了解过"
面试官微微一笑,
"好的回去等通知吧"
"然后我就一直在想这个问题了",小呼说
"其实啊,你听我说…",于是小A跟小呼解释了起来
大家都知道switch可以用在于条件判断,但是在java7之前都只能接受byte short int char,就像下面这样
public class JavaSwitch {
public static void switchMethod(int i) {
switch(i) {
case 1:
break;
case 2:
break;
default:
break;
}
}
}
Java7之后我们可以用String来进行判断了
public class JavaSwitch {
public static void switchMethod(String i) {
switch(i) {
case "Hello":
break;
case "World":
break;
default:
break;
}
}
}
那么当它比较的时候是对字符串进行比较的吗?其实不是的,我们看下编译后的字节码就明白
public static void switchMethod(java.lang.String);
Code:
0: aload_0
1: astore_1
2: iconst_m1
3: istore_2
4: aload_1
5: invokevirtual #2 // Method java/lang/String.`hashCode:()`I
8: lookupswitch { // 2
69609650: 36
83766130: 50
default: 61
}
36: aload_1
37: ldc #3 // String Hello
39: invokevirtual #4 // Method java/lang/String.`equals`:(Ljava/lang/Object;)Z
42: ifeq 61
45: iconst_0
46: istore_2
47: goto 61
50: aload_1
51: ldc #5 // String World
53: invokevirtual #4 // Method java/lang/String.`equals`:(Ljava/lang/Object;)Z
56: ifeq 61
59: iconst_1
60: istore_2
61: iload_2
62: lookupswitch { // 2
0: 88
1: 91
default: 94
}
88: goto 94
91: goto 94
94: return
}
我们只需要注意到Sting的hashCode,还有equals方法,就能明白。进行判断的时候,首先把case里的比较条件转换成hashCode,同样的传进来的String也被转换成hashCode, 然后再进行条件判断。所以其实switch对String的判断原理,也是通过整型进行判断的。
switch的判断,其实是对整型的判断。Java7中新增的对String的支持,实际上是先将String进行hashCode,然后再判断的。