13

考虑以下两行代码

if (test ! = null)

if (null != test)

在性能方面,上述两个陈述有什么区别吗?我见过很多人使用后者,当被问到时,他们说这是没有充分理由的最佳实践。

4

8 回答 8

22

没有不同。

第二个仅仅是因为 C/C++ 程序员总是做赋值而不是比较。

例如

// 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.

于 2012-05-08T07:41:54.500 回答
22

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

if("bla".equals(test))

永远不能抛出一个NullPointerExceptionwhile:

if(test.equals("bla")) 

能够。

于 2012-05-08T07:41:56.447 回答
3

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

于 2012-05-08T07:41:28.540 回答
2

第二个对我来说就像“尤达条件”,即if(2 == x) ...可读性要差得多。

于 2012-05-08T07:41:18.230 回答
1

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

这个想法是首先获得静态的已知值,因此在执行比较时不能抛出任何奇怪的异常。

不过,这两种方法都不是“更正确”,因此完全由您决定要使用什么。

于 2012-05-08T07:41:51.613 回答
1

没有区别。但是在第二种方式中,您可以避免像test = null. 因为第二种方式你会得到编译器错误。

于 2012-05-08T07:42:01.520 回答
1

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

这种“最佳实践”来自不存在布尔值的 C 语言。而是使用整数,if (foo = 1)这不是语法错误,而是与if (foo == 1).

在 Java 中,if 中只能包含布尔表达式,这种做法没有多大意义。

于 2012-05-08T07:43:56.150 回答
0

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

  • 第一种形式对于代码阅读器是可读的,因为人们通常从左到右阅读代码。
  • 第二种形式更适合代码编写者,因为在 java=中,运算符用于赋值,==运算符用于等效测试,但人们通常使用 inif语句=而不是,因为 null 不能在赋值语句中使用,因此==第二种方法开发人员会得到。Compile-Time-ErrorLeft-Side
于 2012-05-08T08:04:10.743 回答