if
在Java中,经典语句有两种:if {} else {}
和速记:exp ? value1 : value2
。一个比另一个快还是相同?
声明:
int x;
if (expression) {
x = 1;
} else {
x = 2;
}
三元运算符:
int x = (expression) ? 1 : 2;
if
在Java中,经典语句有两种:if {} else {}
和速记:exp ? value1 : value2
。一个比另一个快还是相同?
声明:
int x;
if (expression) {
x = 1;
} else {
x = 2;
}
三元运算符:
int x = (expression) ? 1 : 2;
if
用于语句中。?
用于表达式中。
Answers:
那里只有一种“ if”语句。另一个是条件表达式。至于哪种性能更好:它们可以编译为相同的字节码,并且我希望它们的行为相同-或如此接近以至于您绝对不希望在性能方面选择一个。
有时一条if
语句更具可读性,有时条件运算符将更具可读性。特别是,当两个操作数简单且无副作用时,我建议使用条件运算符,而如果两个分支的主要目的是它们的副作用,则可能要使用一条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;
}
}
字节码反编译为javap -c Test
:
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以不同的本机代码结束,我将感到非常惊讶。
main
和main2
是完全一样的?
您的两个示例都可能会编译为相同或几乎相同的字节码,因此性能应该没有差异。
如果执行速度有所不同,则仍应使用最惯用的版本(第二个版本用于根据简单条件和两个简单的子表达式分配单个变量,第一个版本用于执行更复杂的操作或单行不适合的操作)。
只是添加到所有其他答案:
第二个表达式通常称为三级/三级运算符/语句。它可以返回表达式,因此非常有用。有时,它使代码对于典型的简短语句更加清晰。
final
字段,您可以使用构造函数块设置一个值(尽管条件运算符看起来比IMO好十亿倍),并且可以使用局部变量在稍后在代码块中首次使用之前分配一个值我认为,三元组比后者更具优势的唯一情况if-else
是在调用时super(...)
或this(...)
在构造函数内部时。
三元运算符比if-else条件要快。
public class TerinaryTest {
public static void main(String[] args)
{
int j = 2,i = 0;
Date d1 = new Date();
for(long l=1;l<100000000;l++)
if(i==1) j=1;
else j=0;
Date d2 = new Date();
for(long l=1;l<100000000;l++)
j=i==1?1:0;
Date d3 = new Date();
System.out.println("Time for if-else: " + (d2.getTime()-d1.getTime()));
System.out.println("Time for ternary: " + (d3.getTime()-d2.getTime()));
}
}
测试结果:
Trail-1:
否则的时间:63
三元时间:31
Trail-2:
否则的时间:78
三级时间:47
Trail-3:
否则的时间:94
三元时间:31
Trail-4:
否则的时间:78
三级时间:47