switch 优化
if-else源代码
public class IfElseDemo {
public static void main(String[] args) {
int a=1;
if(a==1){
System.out.println(1);
}else if (a==2){
System.out.println(2);
}else if(a==3) {
System.out.println(3);
}else if (a==4) {
System.out.println(4);
}else {
System.out.println(5);
}
}
}
字节码
0: iconst_1
1: istore_1
2: iload_1
3: iconst_1
4: if_icmpne 17
7: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
10: iconst_1
11: invokevirtual #13 // Method java/io/PrintStream.println:(I)V
14: goto 69
17: iload_1
18: iconst_2
19: if_icmpne 32
22: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
25: iconst_2
26: invokevirtual #13 // Method java/io/PrintStream.println:(I)V
29: goto 69
32: iload_1
33: iconst_3
34: if_icmpne 47
37: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
40: iconst_3
41: invokevirtual #13 // Method java/io/PrintStream.println:(I)V
44: goto 69
47: iload_1
48: iconst_4
49: if_icmpne 62
52: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
55: iconst_4
56: invokevirtual #13 // Method java/io/PrintStream.println:(I)V
59: goto 69
62: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
65: iconst_5
66: invokevirtual #13 // Method java/io/PrintStream.println:(I)V
69: return
switch 源代码
public class SwitchTest {
public static void main(String[] args) {
int a=1;
switch (a){
case 1:
System.out.println(1);
break;
case 2:
System.out.println(2);
break;
case 3:
System.out.println(3);
break;
case 4:
System.out.println(4);
break;
default:
System.out.println(5);
break;
}
}
}
switch 字节码
0: iconst_1
1: istore_1
2: iload_1
3: tableswitch { // 1 to 4
1: 32
2: 42
3: 52
4: 62
default: 72
}
32: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
35: iconst_1
36: invokevirtual #13 // Method java/io/PrintStream.println:(I)V
39: goto 79
42: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
45: iconst_2
46: invokevirtual #13 // Method java/io/PrintStream.println:(I)V
49: goto 79
52: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
55: iconst_3
56: invokevirtual #13 // Method java/io/PrintStream.println:(I)V
59: goto 79
62: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
65: iconst_4
66: invokevirtual #13 // Method java/io/PrintStream.println:(I)V
69: goto 79
72: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
75: iconst_5
76: invokevirtual #13 // Method java/io/PrintStream.println:(I)V
79: return
总结
通过看上面的字节码,可以看出switch 代码在编译阶段进行了优化,添加了一个table表,只需要进行一次hash查表就可以跳转到相应代码的位置,不需要像if-else 一样一个个进行判断。