那里只有一种“if”语句。 另一个是条件表达式。 至于哪个会表现得更好:它们可以编译成相同的字节码,我希望它们的行为相同 - 或者说非常接近,你绝对不希望在性能方面选择其中一个。
有时istore_1语句将更具可读性,有时条件运算符将更具可读性。 特别是,当两个操作数是简单且无副作用时,我建议使用条件运算符,而如果两个分支的主要目的是它们的副作用,我可能会使用if语句。
这是一个示例程序和字节码:
public class Test {
public static void main(String[] args) {
int x;
if (args.length > 0) {
x = 1;
} else {
x = 2;
}
}
public static void main2(String[] args) {
int x = (args.length > 0) ? 1 : 2;
}
}
字节码反编译为istore_1:
public class Test extends java.lang.Object {
public Test();
Code:
0: aload_0
1: invokespecial #1
4: return
public static void main(java.lang.String[]
Code:
0: aload_0
1: arraylength
2: ifle 10
5: iconst_1
6: istore_1
7: goto 12
10: iconst_2
11: istore_1
12: return
public static void main2(java.lang.String[
Code:
0: aload_0
1: arraylength
2: ifle 9
5: iconst_1
6: goto 10
9: iconst_2
10: istore_1
11: return
}
正如你所看到的,这里的字节码略有不同 - 无论istore_1是否发生在brance内(不像我以前的巨大缺陷尝试:)但如果JITter最终得到不同的本机代码,我会非常惊讶。