use*_*716 17 java if-statement switch-statement java-7
在Java 7中,string对象可以是switch语句的表达式.有人可以从官方文档中解释以下声明吗?
Java编译器通常使用String对象生成比使用链式if-then-else语句更高效的字节码.
Pau*_*gas 39
有两个版本的类,例如
用if-then-else:
public class IfThenElseClass {
public static void main(String[] args) {
String str = "C";
if ("A".equals(str)) {
} else if ("B".equals(str)) {
} else if ("C".equals(str)) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
用switch:
public class SwitchClass {
public static void main(String[] args) {
String str = "C";
switch (str) {
case "A":
break;
case "B":
break;
case "C":
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我们来看看字节码.获取if-then-else版本的字节码:
Compiled from "CompileSwitch.java"
public class CompileSwitch {
public CompileSwitch();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #16 // String C
2: astore_1
3: ldc #18 // String A
5: aload_1
6: invokevirtual #20 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
9: ifne 28
12: ldc #26 // String B
14: aload_1
15: invokevirtual #20 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
18: ifne 28
21: ldc #16 // String C
23: aload_1
24: invokevirtual #20 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
27: pop
28: return
}
Run Code Online (Sandbox Code Playgroud)
获取switch版本的字节码:
Compiled from "CompileSwitch.java"
public class CompileSwitch {
public CompileSwitch();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #16 // String C
2: astore_1
3: aload_1
4: dup
5: astore_2
6: invokevirtual #18 // Method java/lang/String.hashCode:()I
9: lookupswitch { // 3
65: 44
66: 56
67: 68
default: 77
}
44: aload_2
45: ldc #24 // String A
47: invokevirtual #26 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
50: ifne 77
53: goto 77
56: aload_2
57: ldc #30 // String B
59: invokevirtual #26 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
62: ifne 77
65: goto 77
68: aload_2
69: ldc #16 // String C
71: invokevirtual #26 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
74: ifne 77
77: return
}
Run Code Online (Sandbox Code Playgroud)
在第一个版本中,通过equals为每个条件调用方法来比较字符串,直到找到它为止.
在第二个版本中获得第一个hashCode字符串.然后,这是与值hashCode的每个case.见lookupswitch.如果重复这些值中的任何一个恰好运行代码case.否则,调用equals绑定案例的方法.这比以前调用equals方法要快得多.
| 归档时间: |
|
| 查看次数: |
10095 次 |
| 最近记录: |