在Java中有两种if
语句 - 经典的:if {} else {}
和简写的:exp ? value1 : value2
。它们中的一种比另一种更快,还是它们相同?
int x;
if (expression) {
x = 1;
} else {
x = 2;
}
三元运算符:
int x = (expression) ? 1 : 2;
在Java中有两种if
语句 - 经典的:if {} else {}
和简写的:exp ? value1 : value2
。它们中的一种比另一种更快,还是它们相同?
int x;
if (expression) {
x = 1;
} else {
x = 2;
}
三元运算符:
int x = (expression) ? 1 : 2;
这里只有一种“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
是否出现在括号内(与我之前极其错误的尝试不同:)但是,如果JITter最终生成了不同的本地代码,我会感到非常惊讶。
main
和main2
完全相同,对吗? - ColinD你的两个例子可能会编译成相同或几乎相同的字节码,因此性能上应该没有区别。
如果执行速度有差异,则仍应使用最惯用的版本(对于基于简单条件和两个简单子表达式分配单个变量的情况,应使用第二种方式;对于执行更复杂操作或不适合单行执行的操作,应使用第一种方式)。
这两个是相同的。它们都非常快,通常在10-30纳秒左右(取决于使用模式)。这个时间范围对你很重要吗?
你应该做你认为最清晰的事情。
除了其他答案,我还想补充一点:
第二个表达式通常被称为三元运算符/语句。它非常有用,因为它返回一个表达式。有时对于典型的短语句来说,它可以使代码更加清晰。
final String whichTable = (Integer.parseInt(clientId) > 500) ? "serverClients" : "offlineClients";
然后我可以在需要 whichTable 值为 final 的地方使用这个表达式的结果。以下做法是不合法的:final String whichTable = "";
if (Integer.parseInt(clientId) > 500) {
whichTable = "serverClients";
} else {
whichTable = "offlineClients";
}
- James Perihfinal
字段的情况下,您可以使用构造块来设置值(尽管条件运算符在我看来好看很多),而对于局部变量,则可以在您所在的代码块中稍后首次使用之前分配一个值。我认为三元运算符比if-else
更有优势的唯一情况是在构造函数内调用super(...)
或this(...)
时。 - Kröw它们不会有任何区别 - 它们将被编译成相同的结果。
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()));
}
}
测试结果:
测试1:
if-else所需时间:63
三目运算符所需时间:31
测试2:
if-else所需时间:78
三目运算符所需时间:47
测试3:
if-else所需时间:94
三目运算符所需时间:31
测试4:
if-else所需时间:78
三目运算符所需时间:47
if
用于陈述。?
用于表达式。 - Mike Dunlavey