(a != null) 或者 (null != a)

5

将变量与null进行比较和将null与变量进行比较有什么区别吗?

例如,哪种比较更好(a != null)还是(null != a)? 我在某个地方读到第二种方法更快,但没有找到原因。


5
优于 Yoda 条件 :),是我创造的新编程术语。 - denis.solonenko
6个回答

25
不,没有更快的方法。这是个彻头彻尾的谎言。使用第二个版本没有任何优势,只会使可读性变差。
这一切都来自于C语言,你可以错误地编写。
if(x = 3) 
代替
if( x == 3)

有些人认为最好先写常量,这样如果你写了=而不是==,编译器就会报错。因此一些资源建议首先写常量。

if(3 == x)

有些人不知道为什么需要这样做,他们将这个想法推广到了在构造和语言中根本没有意义的地方。在我看来,在原始的C语境中也没有多大意义,但这是个人口味的问题。


实际上,速度是有差别的。测试 null == var 比较慢一条指令,因为 null 必须被推入堆栈。虽然不多,但也不完全相同。 - Bohemian
@Bohemian:这就是优化器的工作,负责处理这样的微观优化。 - Armen Tsirunyan

9
即使速度有所差异,我期望在99.99%的应用程序中这种差异是微不足道的。事实上,我不认为会有任何速度差异。就个人而言,我觉得 if (a != null) 更易读 - 在大多数情况下,可读性比性能更重要。

我发现 null != a 更易读,可能是习惯问题 :-) - aishwarya
4
从C或C++中养成的习惯?使用这种比较方式来进行防御可能是有道理的(尽管现代编译器会捕捉到意外赋值,如我所知),但我认为大多数没有明显好处背景的开发人员更喜欢使用“变量优先”形式,因为更易读。 - Jon Skeet

4

在处理字符串时,您可能只想在变量前使用文字。

if("abcd".equals(name)) 不会抛出 NPE,而 if(name.equals("abcd")) 如果 namenull,则会抛出异常。


3

通常这样做是为了防止意外赋值而不是比较:

( a = null ) //will not give error

( null = a ) //will give error

我相信效率并不是原因,即使是,优化器也会以二进制形式呈现相同的代码。


1
我们在Java中不能犯这个错误,但在C/C++中可以。 - Tu Tran
@H3S:如果我们足够努力,我们也可以在Java中犯这个错误:Boolean a = true; if (a = null) {}。没有编译错误,但在运行时会出现NPE。 - Thilo
@H3S 你说得对 - 排除 Thilo 的例子,那是个好例子 - 我没想到。 - Luchian Grigore
你可能会因为任何非原始类型而犯下 if(variable = null) 的错误。 - adarshr
@adarshr 我认为你做不到。在Java中,这也会产生一个错误,因为类型不能隐式转换为布尔值。我想那就是H3S的观点。 - Luchian Grigore
显示剩余2条评论

0

不,完全没有任何区别。


0

现在不是Java,以前可能是C语言,你可能会无意中忘记感叹号,但代码仍然可以编译通过。基本上,a = null将被视为将null赋值给a的表达式,并始终评估为true(因为赋值成功)。

今天的编译器更加强大。虽然老习惯难改,我仍然写null != a :-)


很抱歉晚来参与讨论,但是你关于“一个将null赋值给a并且总是评估为true(因为赋值成功)的表达式”的评论是不正确的。它会评估为null的值(所以如果null为false,它可以是false)。 - Mr Lister

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