哪个具有更好的性能:test!= null或null!= test

时间:2012-05-08 07:38:41

标签: java null

考虑以下两行代码

if (test ! = null)

if (null != test)

上述两个陈述是否存在差异,表现明智?我见过很多人使用后者,当被问及他们说这是一个没有充分理由的最佳实践。

8 个答案:

答案 0 :(得分:22)

没有区别。

第二个问题仅仅是因为C / C ++程序员总是进行分配而不是比较。

E.g。

// no compiler complaint at all for C/C++
// while in Java, this is illegal.
if(a = 2) {
}
// this is illegal in C/C++
// and thus become best practice, from C/C++ which is not applicable to Java at all.
if(2 = a) {
}

虽然java编译器会生成编译错误。

所以我个人更喜欢第一个,因为可读性,人们倾向于从左到右阅读,阅读为if test is not equal to null而不是null is not equal to test

答案 1 :(得分:21)

它们完全一样。使用equals时,第二个是有意义的:

if("bla".equals(test))

永远不会抛出NullPointerException而是:

if(test.equals("bla")) 

即可。

答案 2 :(得分:3)

没有性能差异,但我个人认为第二个令人困惑。

答案 3 :(得分:2)

第二个人像“Yoda条件”一样找我,即if(2 == x) ...并且可读性低得多。

答案 4 :(得分:1)

最好的做法是避免一些大多数现代IDE都会遇到的基本错误,因为有时候你想要在非空的更复杂类型之间进行比较并最终做出意外分配。因此模式保持不变,但我从未见过这与性能有关,并且从未见过它生成特殊的字节代码。

我们的想法是首先获得静态的已知值,这样在执行比较时就不会抛出任何奇怪的异常。

这两种方法都没有“更正确”,所以完全取决于你决定你想要使用什么。

答案 5 :(得分:1)

没有区别。但第二种方式是避免像test = null这样的拼写错误。因为第二种方式会导致编译错误。

答案 6 :(得分:1)

使用后者不是最佳做法。两者都是等价的,但前者更容易阅读。

这个“最佳实践”来自C,其中布尔值不存在。而是使用整数,if (foo = 1)不是语法错误,但与if (foo == 1)完全不同。

在Java中,只有布尔表达式可以在if中,并且这种做法没有多大意义。

答案 7 :(得分:0)

两种形式之间没有什么不同。没有性能问题,但有以下注意事项:

  • 第一种形式对于代码阅读器是可读的,因为人们通常从左到右阅读代码。
  • 第二种形式对于代码编写器更好,因为在java =中运算符用于赋值,==运算符用于测试等效,但人们通常在if语句{{1}中使用而不是=,由第二个approch开发人员获取==,因为null不能在赋值语句的Compile-Time-Error中使用。