三元运算符是否比Java中的“if”条件更快

我倾向于“ if-conditional syndrome ”,这意味着我倾向于一直使用条件。 我很少使用三元运算符。 例如:

//I like to do this: int a; if (i == 0) { a = 10; } else { a = 5; } //When I could do this: int a = (i == 0) ? 10:5; 

我使用哪个问题? 哪个更快? 是否存在显着的性能差异? 尽可能使用最短的代码是一种更好的做法吗?

我使用哪个问题?

是! 第二个是更具可读性。 你正在交易一行,它简明扼要地表达你想要的九行有效混乱。

哪个更快?

都不是。

尽可能使用最短的代码是一种更好的做法吗?

不是“只要有可能”,但在任何可能的情况下都不会产生不利影响。 较短的代码至少可能更具可读性,因为它侧重于相关部分而不是偶然影响(“样板代码”)。

如果有任何性能差异(我怀疑),它将是微不足道的。 专注于编写最简单,最易读的代码。

话虽如此,试着克服你对条件运算符的厌恶 – 虽然它有可能过度使用它,但它在某些情况下确实很有用。 在你给出的具体例子中,我肯定会使用条件运算符。

三元运算符示例:

 int a = (i == 0) ? 10 : 5; 

你不能用if / else这样做:

 // invalid: int a = if (i == 0) 10; else 5; 

这是使用三元运算符的一个很好的理由。 如果您没有作业:

 (i == 0) ? foo () : bar (); 

if / else不是那么多代码:

 if (i == 0) foo (); else bar (); 

在性能危急情况下:测量它。 如果存在瓶颈,请使用目标计算机(目标JVM)测量它,并使用典型数据。 否则为了可读性。

嵌入在上下文中,简短forms有时非常方便:

 System.out.println ("Good morning " + (p.female ? "Miss " : "Mister ") + p.getName ()); 

是的,这很重要,但不是因为代码执行性能。

与简单的语法结构相比,更快(高性能)编码与循环和对象实例化更相关。 编译器应该处理优化(它将完全相同的二进制文件!)所以你的目标应该是你从未来的效率(人类永远是软件的瓶颈)。

Josh Bloch在Parleys.com上的“表现焦虑”谈话

引用9行与1行的答案可能会产生误导:较少的代码行并不总是更好。 在有限的情况下,三元运算符可以更简洁(您的示例很好)。

但是它们经常被滥用以使代码不可读(这是一个主要的罪恶)=不要嵌套三元运算符!

还要考虑将来的可维护性,if-else更容易扩展或修改:

 int a; if ( i != 0 && k == 7 ){ a = 10; logger.debug( "debug message here" ); }else a = 3; logger.debug( "other debug message here" ); } int a = (i != 0 && k== 7 ) ? 10 : 3; // density without logging nor ability to use breakpoints 

ps非常完整的stackoverflow回答To三元或不三元?

三元运算符只是简写。 它们编译成等效的if-else语句,这意味着它们将完全相同

此外,三元运算符启用“可选”参数的forms。 Java不允许方法签名中的可选参数,但是三元运算符使您可以在为参数值提供null时轻松内联默认选项。

例如:

 public void myMethod(int par1, String optionalPar2) { String par2 = ((optionalPar2 == null) ? getDefaultString() : optionalPar2) .trim() .toUpperCase(getDefaultLocale()); } 

在上面的示例中,将null作为String参数值传递给您一个默认字符串值而不是NullPointerException 。 它简短而且甜美,我想说,非常可读。 而且,正如已经指出的那样,在字节码级别,三元运算符和if-then-else之间确实没有区别。 如上例所示,选择哪个决定完全取决于可读性。

此外,通过重载方法,此模式使您可以使String参数真正可选(如果认为这样做有用):

 public void myMethod(int par1) { return myMethod(par1, null); } 

对于给出的示例,我更喜欢三元或条件运算符( ? ),原因是:我可以清楚地看到分配a不是可选的。 举一个简单的例子,扫描if-else块并不难看出每个子句中都分配了a ,但想象一下每个子句中的几个赋值:

 if (i == 0) { a = 10; b = 6; c = 3; } else { a = 5; b = 4; d = 1; } a = (i == 0) ? 10 : 5; b = (i == 0) ? 6 : 4; c = (i == 0) ? 3 : 9; d = (i == 0) ? 12 : 1; 

我更喜欢后者,所以你知道你没有错过任务。

最好使用任何一个更好的读取 – 在所有实际效果0性能之间的差异。

在这种情况下,我认为最后一个语句比第一个if语句读得更好,但要注意不要过度使用三元运算符 – 有时它确实会使事情变得不那么清楚。

尝试使用switch case语句,但通常不是性能瓶颈。