Java代码
具有一个类的两个版本,例如
与
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)) { } }}与
switch:
public class SwitchClass { public static void main(String[] args) { String str = "C"; switch (str) { case "A": break; case "B": break; case "C": break; } }}字节码
让我们看一下字节码。获取
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}获取
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}结论
在第一个版本中,通过
equals
为每个条件调用方法来比较字符串,直到找到为止。在第二个版本中,首先
hashCode
获取字符串。然后,这是与值hashCode
的每个case
。请参阅lookupswitch
。如果重复这些值中的任何一个,则恰好为该代码运行代码case
。否则,调用equals
捆绑方法的情况。这比equals
仅调用该方法快得多。



