三元运算符是否比“A”快;如果;Java中的条件

三元运算符是否比“A”快;如果;Java中的条件,java,performance,optimization,Java,Performance,Optimization,我倾向于“如果条件综合征”,这意味着我总是倾向于使用如果条件。我很少使用三元运算符。例如: //我喜欢这样做: INTA; 如果(i==0) { a=10; } 其他的 { a=5; } //当我能做到这一点时: INTA=(i==0)?10:5; 我用哪一个重要吗?哪个更快?是否存在显著的性能差异?尽可能使用最短的代码是更好的做法吗 我用哪一个重要吗 对!!第二种更具可读性。你交易的一行简洁地表达了你想要的,而九行杂乱无章 哪个更快 都不是 尽可能使用最短的代码是更好的做法吗 不是“任何时

我倾向于“如果条件综合征”,这意味着我总是倾向于使用如果条件。我很少使用三元运算符。例如:

//我喜欢这样做:
INTA;
如果(i==0)
{
a=10;
}
其他的
{
a=5;
}
//当我能做到这一点时:
INTA=(i==0)?10:5;
我用哪一个重要吗?哪个更快?是否存在显著的性能差异?尽可能使用最短的代码是更好的做法吗

我用哪一个重要吗

对!!第二种更具可读性。你交易的一行简洁地表达了你想要的,而九行杂乱无章

哪个更快

都不是

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


不是“任何时候都可能”,但肯定是在没有不利影响的情况下。较短的代码至少可能更具可读性,因为它关注的是相关部分,而不是附带影响(“样板代码”)。

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

如果有任何性能差异(我怀疑),则可以忽略不计。集中精力编写最简单、可读性最强的代码


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

最好使用任何读得更好的运算符-在所有实际效果中,性能之间的差异为0


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

三元运算符示例:

int a = (i == 0) ? 10 : 5;
public void myMethod(int par1, String optionalPar2) {

    String par2 = ((optionalPar2 == null) ? getDefaultString() : optionalPar2)
            .trim()
            .toUpperCase(getDefaultLocale());
}
您不能使用if/else这样的选项执行作业:

// invalid:
int a = if (i == 0) 10; else 5;
这是使用三元运算符的一个很好的理由。如果您没有任务:

(i == 0) ? foo () : bar ();
if/else不是更多的代码:

if (i == 0) foo (); else bar ();
在性能关键的情况下:测量它。如果存在瓶颈,则使用目标机器、目标JVM和典型数据来测量它。否则就追求可读性

在上下文中,缩写形式有时非常方便:

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

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

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

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

但它们经常被滥用,使代码无法读取(这是一个基本的错误)=不要嵌套三元运算符

还考虑将来的可维护性,如果其他更容易扩展或修改:

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

p、 在

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

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

例如:

int a = (i == 0) ? 10 : 5;
public void myMethod(int par1, String optionalPar2) {

    String par2 = ((optionalPar2 == null) ? getDefaultString() : optionalPar2)
            .trim()
            .toUpperCase(getDefaultLocale());
}
在上面的示例中,将
null
作为
String
参数值传递会获得默认字符串值,而不是
NullPointerException
。它很短,很甜,而且,我想说,非常可读。此外,正如已经指出的,在字节码级别,三值运算符和if-then-else之间实际上没有区别。在上面的例子中,选择的决定完全基于可读性

此外,此模式允许您通过如下重载方法使
字符串
参数真正成为可选参数(如果认为这样做有用):

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;

我更喜欢后者,这样你就知道你没有错过一个作业。

这没关系,你应该关注干净的代码,而不是性能。在这种情况下,我认为三元运算符更干净。而且,如果(I==0)a=10,你可以这样做;否则a=5没有显示明确需求的过早优化是糟糕的,糟糕的,糟糕的。使用6个月后你自己最能理解的代码。我同意@Niklas,但如果你真的不喜欢三元运算符,也不关心真正微不足道的性能差异,你可以将变量初始化为默认值(大概是5),只使用“if”而不使用“else”重新分配。@Hovercraft:你自己和你的同事,有人想在这里添加。perse,可读并不意味着它重要。@Jon:是的,它重要。实际上,可读性才是最重要的。@Jon如果唯一的区别是可读性,那么可读性就是所有的模式。如果你能用短的方法避免临时变量,那么它在内存消耗和执行时间上就有区别。我想补充一点,三元数并不总是更具可读性。考虑<代码>最大速度= ISPARGRONTROLL()?5:(isInnerCity()?50:100)与一系列
if
s或
开关
语句的比较。此外,当表达式变长时(
maxSpeed=map.getStreetType(car.ge