三元运算符是否比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
语句,但通常不是性能瓶颈。