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

JRu*_*ner 110 java optimization performance

我倾向于" 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;
Run Code Online (Sandbox Code Playgroud)

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

Kon*_*lph 102

我使用哪个问题?

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

哪个更快?

都不是.

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

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

  • @Jon:是的,确实如此.可读性是有效的. (19认同)
  • @Jon如果唯一的区别是可读性,那么可读性就是*所有*那些模式. (6认同)
  • 我想补充一点,三元并不总是更具可读性。考虑 `maxSpeed = isParkingLot() 吗?5 : ( isInnerCity() ? 50 : 100);` 与`if`s 或`switch` 语句链。此外,当表达式变长时 (`maxSpeed = map.getStreetType(car.getLocation()) == MapType.PARKING_LOT ? TrafficRules.getMaxSpeed(MapType.PARKING_LOT) : TrafficRules.getMaxSpeed()`),它可能难以阅读。 (4认同)
  • 可读并不意味着它很重要,本身。 (2认同)

Jon*_*eet 31

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

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

  • @Jon:条件运算符是你所谓的三元运算符的实际*name*.它是*a*三元运算符,因为它有3个操作数,但它的*name*是条件运算符. (17认同)
  • 好的,谢谢你的澄清.我以为你的意思是明确的`if-else`语法. (2认同)

use*_*own 27

三元运算符示例:

int a = (i == 0) ? 10 : 5;
Run Code Online (Sandbox Code Playgroud)

你不能用if/else这样做:

// invalid:
int a = if (i == 0) 10; else 5;
Run Code Online (Sandbox Code Playgroud)

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

(i == 0) ? foo () : bar ();
Run Code Online (Sandbox Code Playgroud)

if/else不是那么多代码:

if (i == 0) foo (); else bar ();
Run Code Online (Sandbox Code Playgroud)

在性能危急情况下:测量它.如果存在瓶颈,请使用目标机器(目标JVM)和典型数据进行测量.否则为了便于阅读.

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

System.out.println ("Good morning " + (p.female ? "Miss " : "Mister ") + p.getName ()); 
Run Code Online (Sandbox Code Playgroud)


小智 15

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

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

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
Run Code Online (Sandbox Code Playgroud)

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

  • 我不同意这一点:例如,嵌套条件语句是惯用的和可读的,尤其是在测试多个案例时,如 `return x == 1 ? “一”:x == 2 ? “两个”:“很多”;`。适当的缩进和分成多行在这里有帮助。 (2认同)

Jon*_*and 8

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


sco*_*ttb 5

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

例如:

public void myMethod(int par1, String optionalPar2) {

    String par2 = ((optionalPar2 == null) ? getDefaultString() : optionalPar2)
            .trim()
            .toUpperCase(getDefaultLocale());
}
Run Code Online (Sandbox Code Playgroud)

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

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

public void myMethod(int par1) {
    return myMethod(par1, null);
}
Run Code Online (Sandbox Code Playgroud)