在jdk1.7中支持了switch(String)的语法,下面从字节码角度来分析实现方式.
源码:
public static void main(String[] args) throws Exception {
switch ("abc") {
case "abc":
task();
break;
case "def":
task();
break;
}
}
通过jdk提供的反编译工具javap -v反编译class文件,其中关键代码的jvm指令如下:
0: ldc #19 // String abc
2: dup
3: astore_1
4: invokevirtual #21 // Method java/lang/String.hashCode:()I
7: lookupswitch { // 2
96354: 32
99333: 44
default: 65
}
32: aload_1
33: ldc #19 // String abc
35: invokevirtual #27 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
38: ifne 56
41: goto 65
44: aload_1
45: ldc #31 // String def
47: invokevirtual #27 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
50: ifne 62
53: goto 65
56: invokestatic #33 // Method task:()V
59: goto 65
62: invokestatic #33 // Method task:()V
65: return
对以上做一下简短的解释:
1.常量字符串"abc"入栈
2.计算字符串的哈希值
3.根据得到的哈希值结合lookupswitch给出的列表信息(其中包含有case后面跟着的字符串的哈希值)跳转到目标位置
4.此外,在哈希值相等之后还需要比较两个字符串是否相等,因为不同的字符串哈希值可能相等,比如abc和acD,具体可以查看String类的hashCode()方法