在Java中,if语句有两种类型-经典:if {} else {}和简写:exp ? value1 : value2。 一个比另一个快还是相同?
声明:
int x;
if (expression) {
x = 1;
} else {
x = 2;
}
三元运算符:
int x = (expression) ? 1 : 2;
我想绝对没有区别。它只是语法。除非编译器有些邪恶(或其他)并且我是错的
你(微)基准了吗?分享结果。
两者都会被激怒。完全没有区别。并且不要打扰反编译的东西。 HotSpot要做的第一件事是进行javac应用的所有优化。
比较低级字节码更好。
关于字节码,您唯一可以说的是它是否相同。
id建议int x=1; if (!expression) x++;-否,甚至更好,请停止微优化。
它们不以不同的速度存在。它们出于不同的目的而存在。我确定您了解语句和表达式之间的区别。语句执行操作。表达式产生值。 if用于语句中。 ?用于表达式中。
@schnaader每个人都知道++ x;比x ++快:P此外,该代码实际上要慢一些(当表达式为假时)2写,有条件跳转和读-与原始代码中有条件跳转,写和读的情况相比不断跳跃
+1是对这个问题的回答,即使原始问题的意图有误,也值得一读。
@詹姆斯:你是对的。因此,我们吸取了教训:停止微优化:)它不会改变任何东西,甚至不会使事情变得更糟。
@finnw-反对者可能来自对微优化问题感到厌倦的开发人员。从本质上讲,它们只不过是对那些在现实世界中没有真正价值的事物进行思索。
如果您正在阅读本文,请不要错过詹姆斯的评论
那里只有一种" 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以不同的本机代码结束,我将感到非常惊讶。
s /条件语句/条件表达式/
@劳伦斯:嗯-谢谢,固定。
我猜你不是说main和main2完全一样吗?
@ColinD:糟糕:)编辑中...
令人印象深刻。我直到现在才知道您可以编译字节码。
@Kyle:我编译了Java,然后用javap进行了反编译。
哦...您将其反编译以查看其编译结果,以确定哪种样式效果最佳?
@Kyle:是的。 id最希望字节码是相同的。实际上,它几乎是完全相同的:)
令人印象深刻的答案:)
您的两个示例都可能会编译为相同或几乎相同的字节码,因此性能应该没有差异。
如果执行速度有所不同,则仍应使用最惯用的版本(第二个版本用于基于简单条件和两个简单??的子表达式分配单个变量,第一个版本用于执行更复杂的操作或单行不适合的操作)。
这些都是一样的。两者都相当快,通常约为10到30纳秒。 (取决于使用模式)这个时间范围对您来说重要吗?
您应该做自己认为最清楚的事情。
只是添加到所有其他答案:
第二个表达式通常称为三级/三级运算符/语句。它会返回一个表达式,因此非常有用。有时,它会使典型的简短语句的代码更加清晰。
在实践中这是一个很好的例子:在Java中,如果我必须基于表达式的结果使String结尾,那么我可以使用三元语法final String whichTable =(Integer.parseInt(clientId)> 500)?" serverClients":" offlineClients";然后,我可以在whichTable需要为最终值的地方使用表达式的值。以下内容将是非法的:最终字符串whichTable ="; if(Integer.parseInt(clientId)> 500){whichTable =" serverClients";} else {whichTable =" offlineClients";}
@JamesPerih确实如此。
@JamesPerih在final字段的情况下,可以使用构造函数块来设置值(尽管条件运算符看起来比IMO好十亿倍),并且可以使用局部变量来分配值,然后在以后的第一次使用之前代码阻止您进入。我认为三元组比if-else更具优势的唯一情况是在构造函数中调用super(...)或this(...)时。
都不-它们将被编译为相同的。