我应该用两个if语句分开AND吗?

时间:2012-12-12 20:06:24

标签: java optimization if-statement

我的代码中有以下几行:

    if (command.equals("sort") && args.length == 2) {
    //run some program
    }

有人建议我应该使用两个单独的if语句,因为如果命令不等于“sort”,则无需评估任何其他if语句,无论是否args长度是正确的。

因此,我需要将我的代码重写为:

if (command.equals("sort")) {
  if (args.length == 2) {
    //run some program
  }
}

我知道他们都做了这个工作,但我的问题是哪一个更好,效率更高?

9 个答案:

答案 0 :(得分:14)

不,那不是真的。他们称之为short circuit,如果第一个条件评估为假,则第二个条件根本不会被评估。

答案 1 :(得分:7)

好吧,因为&&short-circuit运算符。所以if语句实际上都是一样的。

因此,在第一种情况下,如果您的command.equals("sort")返回false,则根本不会评估以下条件。因此,在我看来,只需要使用第一个。它更清楚。

答案 2 :(得分:2)

如上所述,短路将导致程序在条件失败时退出if语句,这意味着不会评估任何其他条件,因此两种格式的评估方式没有实际区别。

我想要注意的是,当你有几个if语句嵌套在一起时,代码易读性会受到负面影响,这对我来说是不嵌套的主要原因。例如:

if( conditionA && conditionaB && !conditionC ){
    // Do Something
}

比以下更清洁:

if( conditionA ){
    if( conditionB ){
        if( !conditionC ){
            // Do Something
        }
    }
}

想象一下,有20个嵌套的if语句?当然不是常见的事情,但可能。

答案 3 :(得分:1)

他们是一样的。对于第一个示例,如果第一个表达式为false,则任何现代运行时都将忽略第二个表达式。

答案 4 :(得分:1)

短路效果更好,由&&和如果您检查值为null,然后对该对象应用函数,则短路运算符效果很好。如果条件1为假,则从条件2停止执行。

前:

String s=null;

if(s!=null && s.length())

这不会引发异常,并且在大多数情况下,如果检查则再保存一个。

答案 5 :(得分:0)

如果条件的顺序相同,则它们的效率完全相同。

if (command.equals("sort") && args.length == 2)

如果command.squals(“sort”)返回false,则将退出,并且永远不会检查args.length。这是short-circuit运算符的&&运算。

归结为风格和可读性问题。 IMO当您在单个if语句中开始链接太多时,很难阅读。

答案 6 :(得分:0)

实际上,它被称为[Lazy_evaluation]:http://en.wikipedia.org/wiki/Lazy_evaluation

答案 7 :(得分:0)

这不是真正的问题,但请注意,如果你想要评估这两个,你可以使用& :

if (methodA() & methodB()) {
    // 
}

而不是

boolean a = methodA();
boolean b = methodB();
if (a && b) {
    //
}

答案 8 :(得分:-1)

是的,他们的建议是完全正确的。我建议你把第一张支票写成:

"sort".equals(command)

在这种情况下,但在将来可能没有意义。首先使用静态类型,这样您就不需要在

之前进行空检查