Java是否浪费时间检查“if(is&&& conditionS)”中的条件,如果= = false?

时间:2013-10-31 15:06:31

标签: java

好的,我正在构建程序以检查许多字段。如果至少有1个字段不正常,那么我不希望我的程序花时间检查其他字段。那么看看这段代码:

 // Util.isReadyToUse method return true if the string is ready for using, & return false if it is not.

boolean isOK=true;

if(!Util.isReadyToUse(firstName)){
   isOK=false;
}
else if(isOK && !Util.isReadyToUse(lastName)){
   isOK=false;
}
else if(isOK && !Util.isReadyToUse(email)){
   isOK=false;
}
.....more checking
if(isOK) {
   //do sthing
}

好的,在运行时,程序将首先检查!Util.isReadyToUse(firstName)。假设它返回(isOK = false)。接下来,该程序将检查isOK && !Util.isReadyToUse(lastName)

所以我的问题是,由于isOK目前为假,那么程序是否会花时间在!Util.isReadyToUse(lastName)之后检查条件&&

好的,作为一个人,如果您看到isOK=false,现在看到isOK && !Util.isReadyToUse(email),那么您不想浪费时间来查看!Util.isReadyToUse(email),因为isOK = false你在&&之后看到isOK

机器也能这样工作吗?

我正在考虑使用break,但为什么人们说break在if语句中不起作用:

if(!Util.isReadyToUse(firstName)){
   isOK=false;
   break;
}
else if(isOK && !Util.isReadyToUse(lastName)){
   isOK=false;
   break;
}......

在这种情况下,最佳解决方案是什么?

6 个答案:

答案 0 :(得分:7)

  

所以我的问题是,既然isOK目前是假的,那么就会   该计划花时间检查病情   !&&?

之后的Util.isReadyToUse(lastName)

Java非常聪明,如果您的条件为if(somethingFlase && something),则somethingShort-circuit evaluation而无法联系到false。由于整个表达式都是if(a && b)而不管第二个条件如何,因此Java无需对其进行评估。

来自15.23. Conditional-And Operator &&

  

如果结果值为false,则条件的值为   表达式为false,右侧操作数表达式不是   评价即可。如果左侧操作数的值为true,则评估右侧表达式。

  • a - 如果falseb,则if(a && b)不会被检查。
  • a - 如果trueb,则会检查false,因为如果它是false,则表达式为{{} 1}}。
  • if(a || b) - 如果atrue,则b不会被检查,因为无论如何这都是true
  • if(a || b) - 如果afalse,则会检查b,因为如果btrue,那么它就会被true是{{1}}。

答案 1 :(得分:2)

不,它会快速删除谓词的其余部分。

你会看到像

这样的东西
if(A != null && A.SomeVal == someOtherVal)

答案 2 :(得分:1)

Java支持所谓的短路评估。见本页:

http://en.wikipedia.org/wiki/Short-circuit_evaluation

这意味着如果语句中的第一个布尔值足以满足该语句,则跳过其余值。如果我们有以下内容:

boolean a = false;
boolean b = true;

if(a && b) /*Do something*/;
永远不会检查

'b',因为'a'的false值足以打破if语句。

话虽如此,您的程序永远不会利用这一点,因为唯一的isOK设置为false是在else if个语句中。

答案 3 :(得分:1)

正如其他响应者所说,Java会做出聪明的事情。

但是你可能希望Java继续检查,在这种情况下你可以使用& vs&&或者vs ||。

if (someMethod() | anotherMethod() {

如果第一种方法retricns为true,Java仍然会执行第二种方法。

if (someMethod() & anotherMethod() {

如果第一个方法为false,Java仍将执行第二个方法。

答案 4 :(得分:1)

不,Java不会“浪费时间”。它被称为short circuit evaluation

这种机制通常用于例如用于空检查:

if (foo != null && foo.neverFailsWithNPE()) {
    // ...
}

答案 5 :(得分:0)

你不需要在if..else if ... else语句中使用break,因为一旦找到一个为真的条件,其余的甚至都不会被查看。