我倾向于“ 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;
我使用的是否重要?哪个更快?是否存在显着的性能差异?尽可能使用最短的代码是更好的做法吗?
答案 0 :(得分:98)
我使用的是否重要?
是的!第二个更具可读性。你正在交易一行,它简明扼要地表达你想要的九行有效混乱。
哪个更快?
都不是。
尽可能使用最短的代码是更好的做法吗?
不是“只要有可能”,但在任何可能的情况下都不会产生不利影响。较短的代码至少可能更具可读性,因为它侧重于相关部分而不是偶然影响(“样板代码”)。
答案 1 :(得分:32)
如果 任何性能差异(我怀疑),它将是微不足道的。专注于编写最简单,最易读的代码。
话虽如此,试着克服你对条件运算符的厌恶 - 虽然它有可能过度使用它,但在某些情况下它可能真的有用。在您给出的具体示例中,我绝对使用条件运算符。
答案 2 :(得分:27)
三元运算符示例:
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)和典型数据进行测量。否则为了便于阅读。
在上下文中,简短形式有时非常方便:
System.out.println ("Good morning " + (p.female ? "Miss " : "Mister ") + p.getName ());
答案 3 :(得分:15)
是的,这很重要,但不是因为代码执行性能。
与简单的语法结构相比,更快(高性能)编码与循环和对象实例化更相关。编译器应该处理优化(它将完全相同的二进制文件!)所以你的目标应该是你从未来的效率(人类永远是软件的瓶颈)。
Josh Bloch's "Performance Anxiety" talk on 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
P.S。非常完整的stackoverflow答案To ternary or not to ternary?
答案 4 :(得分:8)
三元运营商只是简写。它们编译成等效的if-else
语句,这意味着它们完全相同。
答案 5 :(得分:4)
此外,三元运算符启用“可选”参数的形式。 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);
}
答案 6 :(得分:1)
对于给出的示例,出于特定原因,我更喜欢三元或条件运算符(?
):我可以清楚地看到赋值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;
我更喜欢后者,以便你知道你没有错过任务。
答案 7 :(得分:0)
最好使用任何一个读得更好的东西 - 在所有实际效果中,性能之间存在差异。
在这种情况下,我认为最后一个语句比第一个if语句读得更好,但要注意不要过度使用三元运算符 - 有时它确实会使事情变得不那么清楚。
答案 8 :(得分:0)
尝试使用switch case
语句,但通常不是性能瓶颈。