&& amp;的重要性in if()

时间:2012-06-08 08:01:43

标签: java

我想知道这两个代码之间的性能是否存在差异。

String sample="hello";
    if(sample!=null)
    {
       if(!sample.equals(""))
        {
            // some code in here
         }
    }

String sample="hello";
    if(sample!=null && !sample.equals(""))
    {

            // some code in here
    }

据我所知,在第一个代码中,如果sample不为null,那么只有它会进入块。第二段代码也是如此。 我想知道的是性能或更好的编码标准有何不同?为什么?

4 个答案:

答案 0 :(得分:14)

如果您要询问性能,则应始终衡量。但不,不应该有所不同。此外,如果 是你唯一的性能问题代码,那么我会认真地羡慕你。

至于编码标准。较少的嵌套几乎总是更好阅读和遵循。这意味着将两者放在一个if中,特别是因为它们是相关的是可取的。模式

if (check_foo_for_null && compare_foo)

非常常见,因此比其他嵌套if更不令人惊讶。

编辑:备份:

我有两个小方法:

static boolean x(String a) {
    if (a != null && a.equals("Foo"))
        return true;
    else return false;
}

static boolean y(String a) {
    if (a != null) {
        if (a.equals("Foo")) {
            return true;
        } else return false;
    } else return false;
}

产生以下代码:

  static boolean x(java.lang.String);
    Code:
       0: aload_0       
       1: ifnull        15
       4: aload_0       
       5: ldc           #16                 // String Foo
       7: invokevirtual #21                 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
      10: ifeq          15
      13: iconst_1      
      14: ireturn       
      15: iconst_0      
      16: ireturn       

  static boolean y(java.lang.String);
    Code:
       0: aload_0       
       1: ifnull        17
       4: aload_0       
       5: ldc           #16                 // String Foo
       7: invokevirtual #21                 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
      10: ifeq          15
      13: iconst_1      
      14: ireturn       
      15: iconst_0      
      16: ireturn       
      17: iconst_0      
      18: ireturn       

除了一个无关的else跳转目标,代码是相同的。如果你甚至没有else

static boolean z(String a) {
    if (a != null) {
        if (a.equals("Foo"))
            return true;
    return false;
}

然后结果真的一样:

  static boolean z(java.lang.String);
    Code:
       0: aload_0       
       1: ifnull        15
       4: aload_0       
       5: ldc           #16                 // String Foo
       7: invokevirtual #21                 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
      10: ifeq          15
      13: iconst_1      
      14: ireturn       
      15: iconst_0      
      16: ireturn       

答案 1 :(得分:9)

正如其他人所说,表现不应有任何差别。 小提示 - 等于几乎总是调用 instanceof ,它返回 false 为null。 所以写道:

if( !"".equals(foo)) {...}

进行相同的检查并且是空的。

答案 2 :(得分:2)

Bothe在性能方面没有区别。因为在第一种情况下它会检查一个条件,如果失败则它不会进入内部。在第二种情况下,JVM检查第一个条件,如果返回false,则JVM永远不会进行第二次检查。作为逻辑&&如果first false ,则运算符将始终 false

在编码标准方面,我会选择第二个选项,因为它的编码行数较少。

答案 3 :(得分:1)

由于bytcode在编译时执行优化,因此生成的if(sample!=null && !sample.equals(""))很可能会优化为java

如果您在谈论您编写的实际代码,最好只有一个if。由于两个if的结构对于编译器来说更复杂(没有优化)。虽然我没有经验数据来支持这一点。