两段简短的测试代码:
Test2.java (三元运算符)
public class Test2 ... { public static void main(String args[]) ...{ int m =1, n=2; String s = m > n ? "a" : "b"; }}
Test3.java(if...else...)
public class Test3 ... { public static void main(String args[]) ...{ int m = 1, n = 2; if(m > n) ...{ String s = "a"; } else ...{ String s = "b"; } }}
编译后用javap反编译得到下面指令码:
Compiled from "Test2.java"public class Test2 extends java.lang.Object{public Test2(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return
public static void main(java.lang.String[]); Code: 0: iconst_1 1: istore_1 2: iconst_2 3: istore_2 4: iload_1 <-- 变量表索引1处的值压入堆栈,即m的值1 5: iload_2 <-- 变量表索引2处的值压入堆栈,即n的值2 6: if_icmple 14 <-- 比较上面两个值,若true继续,否则跳转到14 9: ldc #2; //String a <-- load constant,将"a"压入堆栈 11: goto 16 14: ldc #3; //String b <-- 将"b"压入堆栈 16: astore_3 <-- 从堆栈弹出值,存储到变量表索引3处 17: return
}
----------------------------------------
Compiled from "Test3.java"public class Test3 extends java.lang.Object{public Test3(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return
public static void main(java.lang.String[]); Code: 0: iconst_1 1: istore_1 2: iconst_2 3: istore_2 4: iload_1 5: iload_2 6: if_icmple 15 9: ldc #2; //String a 11: astore_3 12: goto 18 15: ldc #3; //String b 17: astore_3 18: return
}
关键处都做了注释,一目了然了吧
两者区别不大,只是if...else...多了一条指令,这点差别可以忽略了
