哪种写法更有效:if (null == variable) 还是 if (variable == null)?

45

在Java中,哪一种更有效率,它们之间有什么区别?

if (null == variable)
或者。
if (variable == null)

顺便说一下,在Java中是null,而不是NULL - ryanprayogo
@ryanprayogo - 可以是一个常量... - Thorbjørn Ravn Andersen
请查看此链接(https://en.wikipedia.org/wiki/Yoda_conditions)。 - Jay Ghosh
9个回答

75

(类似于这个问题:null==object和object==null的区别

我认为这两个表达式在性能上绝对没有区别。

有趣的是,然而编译后的字节码(由OpenJDK的javac发出)在两种情况下看起来有些不同。

对于boolean b = variable == null

 3: aload_1               // load variable
 4: ifnonnull 11          // check if it's null
 7: iconst_1              // push 1
 8: goto 12           
11: iconst_0              // push 0
12: istore_2              // store

对于 boolean b = null == variable

 3: aconst_null           // push null
 4: aload_1               // load variable
 5: if_acmpne 12          // check if equal
 8: iconst_1              // push 1
 9: goto 13
12: iconst_0              // push 0
13: istore_2              // store

正如@Bozho所说,variable == null是最常见、默认和首选的风格。

然而,在某些情况下,我倾向于将null放在前面。例如在以下情况下:

String line;
while (null != (line = reader.readLine()))
    process(line);

1
+1 不错的发现...但从性能上来看还是一样吗? :) - Bozho
2
不。:)(我仍然想知道为什么这个答案没有更多的赞..) - Bozho
从我的观察来看,第二组字节码更加处理器密集。第一组只在堆栈上推送一个值,然后将其与null进行比较。第二组在堆栈上推送两个值(一个为null),然后将它们进行比较。由于有两个推送而不是一个,并且有一个额外的字节码,应该会增加一点点开销。这可以通过在一个相当大的循环中运行它(即10亿次)并比较每个循环所需的时间来进行测试。 - Brain2000
@Brain2000,你似乎假设字节码是解释执行的。JIT编译器已经存在了将近20年了。 - aioobe
如何在Java中编写正确的微基准测试? - aioobe
显示剩余4条评论

23

这被称为“尤达条件”,其目的是防止您意外地使用赋值(=)而非相等检查(==)。


除了变量是布尔型的,@assylias。xD - nachokk
1
@assylias 这是正确的,但是 Boolean x=true; if(x=null) 是有效的。 - nachokk
1
@nachokk 我明白了 - 在这种情况下它会抛出 NPE。没问题。 - assylias
SO链接返回“页面未找到”。 - yishaiz

19

没有区别。

if (variable == null) 是(在我看来)更好的编程风格。

请注意,在Java中,null应该小写。


3
是的,我同意。if (null == variable) 就是 Yoda 风格 :) 在这里解释:http://stackoverflow.com/questions/2349378?tab=votes&page=1#tab-top - b.roth
3
@b.roth // 页面未找到。不幸的是。 - Youngjae

13

没有区别

(null == variables) 在早期(C语言)有时用来避免写错:(variable = NULL)


8

简短回答:没有区别。

更详细的回答是:这是一种比较主观的风格上的差异。有些人认为常量应该在左侧,作为一种防御性的风格,以防您将 == 错误键入为 =。有些人则认为常量应该在右侧,因为它更加自然和易读。

如果语言设计得好,并配合良好的编译器和静态分析工具,可以将偏执症最小化,因此您应该编写最可读和自然的代码,这意味着常量应位于右侧。

相关问题

下次请使用搜索功能。


7
第一个是从C语言遗留下来的,也就是说在C中写 if(variable = NULL) 是完全合法的。

5
不准确:null不属于布尔类型,因此不合法。 - Robert

6

从性能角度来看,没有任何实质性的差异。

然而... 如果你打错了一个等于号怎么办?

foo = null; // assigns foo to null at runtime... BAD!

对比

null = foo; // compile time error, typo immediately caught in editor,
developer gets 8 hours of sleep

这是支持在if测试中将null置于左侧的一个理由。其次,如果测试以null开头,读者可以清楚地知道他们正在查看一个null测试,即使等号右侧的表达式很冗长。@aiooba也指出了这个第二个理由。对于某些情况,我倾向于将null放在前面。例如,在以下情况下:
String line;
while (null != (line = reader.readLine()))
    process(line);

1

我的观点是:不要在意这些微不足道的性能优化。如果你的性能不好,找到并解决代码中真正的问题和瓶颈。


-1

没有任何区别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接