对象== null或null ==对象?

我从别人那里听说, null == objectobject == null检查好

例如:

 void m1(Object obj ) { if(null == obj) // Is this better than object == null ? Why ? return ; // Else blah blah } 

有没有什么原因,或者这是另一个神话? 感谢帮助。

这可能是从C学习的习惯,为了避免这种排字错误(single =而不是double == ):

 if (object = null) { 

将常量放在==左边的约定在Java中并不是很有用,因为Java要求if中的expression式求值为boolean值,所以除非常量是boolean值,否则会得到一个编译错误无论哪种方式,你把论据。 (如果它是一个布尔值,你不应该使用==反正…)

正如其他人所说,这是一个从C学到的习惯,以避免错别字 – 尽pipe即使在C,我希望体面的编译器在足够高的警告水平警告。 正如Chandru所说,以这种方式与Java中的null进行比较只会导致问题,如果您使用的是Booleantypes的variables(您不在示例代码中)。 我会说这是一个非常罕见的情况,而不是一个值得改变其他地方编写代码的方式。 (即使在这种情况下,我也不会打扰操作数;如果我想清楚地考虑扭转它们,我相信我可以计算等号。)

没有提到的是,很多人(我自己也包括在内)发现if (variable == constant)forms更具可读性 – 这是expression自己的更自然的方式。 这是不要盲目复制C的一个惯例的原因。你应该总是质疑实践(就像你在这里所做的那样),然后再假设在一个环境中可能有用的东西在另一个环境中是有用的。

这在Java(1.5+)中没有太大价值,除非对象的types是Boolean 。 在这种情况下,这仍然可以得心应手。

if (object = null)在Java 1.5+中不会导致编译失败,如果object是Boolean但会在运行时抛出NullPointerException

在Java中没有很好的理由。

其他一些答案声称,这是因为你可能会意外地将其赋值而不是平等。 但在Java中,你必须在if中有一个布尔值,所以这个:

 if (o = null) 

不会编译。

这在Java中唯一可能的问题是如果variables是布尔值:

 int m1(boolean x) { if (x = true) // oops, assignment instead of equality 

这也密切相关:

 if ("foo".equals(bar)) { 

如果你不想处理NPE,这很方便:

 if (bar!=null && bar.equals("foo")) { 

这个技巧应该可以防止v = nulltypes的错别字。

但是Java只允许布尔expression式作为if()条件,所以这个技巧没什么意义,编译器无论如何都会发现这些错别字。

尽pipe如此,它仍然是C / C ++代码的宝贵技巧。

出于同样的原因,你用C来做; 赋值是一个expression式,所以你把文字放在左边,这样如果你不小心使用=而不是== ,你就不能覆盖它。

那对于那些喜欢在左边持续不断的人来说。 在大多数情况下,左侧的常量将防止抛出NullPointerExceptionexception(或者有另一个空检查)。 例如,String方法equals也是一个空检查。 在左边不变的情况下,会使您无法写入额外的支票。 其中,另一种方式也是稍后进行的。 左边的空值是一致的。

喜欢:

  String b = null; "constant".equals(b); // result to false b.equals("constant"); // NullPointerException b != null && b.equals("constant"); // result to false 

与下面的代码比较:

  String pingResult = "asd"; long s = System.nanoTime ( ); if ( null != pingResult ) { System.out.println ( "null != pingResult" ); } long e = System.nanoTime ( ); System.out.println ( e - s ); long s1 = System.nanoTime ( ); if ( pingResult != null ) { System.out.println ( "pingResult != null" ); } long e1 = System.nanoTime ( ); System.out.println ( e1 - s1 ); 

输出(多次执行后):

 null != pingResult 325737 pingResult != null 47027 

因此, pingResult != null是赢家。

以上输出不正确。 只要分别运行这两个代码块,你会得到实际的结果。 两者将采取同一时间。

还运行下面的代码:

  String pingResult = "asd"; long s = System.nanoTime ( ); if ( null != pingResult ) { //System.out.println ( "null != pingResult" ); } long e = System.nanoTime ( ); System.out.println ( e - s ); long s1 = System.nanoTime ( ); if ( pingResult != null ) { //System.out.println ( "pingResult != null" ); } long e1 = System.nanoTime ( ); System.out.println ( e1 - s1 );