Java条件和和条件或运算符(&&和||)
示例
Java提供了一个条件和运算符以及一个条件或运算符,它们都使用一个或两个类型的操作数boolean并产生boolean结果。这些是:
&&-条件AND运算子,
||-条件或运算符。的评估<left-expr>&&<right-expr>等效于以下伪代码:
{
booleanL=evaluate(<left-expr>);
if(L){
returnevaluate(<right-expr>);
}else{
//短路第二个操作数表达式的求值
returnfalse;
}
}
的评估<left-expr>||<right-expr>等效于以下伪代码:
{ boolean L = evaluate(<left-expr>); if (!L) { return evaluate(<right-expr>); } else { //短路第二个操作数表达式的求值 return true; } }
如上面的伪代码所示,短路运算符的行为等效于使用if/else语句。
示例-在表达式中使用&&作为防护
以下示例显示了&&运算符最常用的使用模式。比较这两种方法,以测试提供的值Integer是否为零。
public boolean isZero(Integer value) { return value == 0; } public boolean isZero(Integer value) { return value != null && value == 0; }
在大多数情况下,第一个版本适用,但如果value参数为null,则将NullPointerException引发a。
在第二个版本中,我们添加了“防护”测试。的value!=null&&value==0表达是通过首先进行评价value!=null试验。如果null测试成功(即结果为true),则对value==0表达式进行求值。如果null测试失败,则value==0跳过的评估(短路),而我们没有得到NullPointerException。
示例-使用&&避免进行昂贵的计算
以下示例显示了如何&&避免使用相对昂贵的计算:
public boolean verify(int value, boolean needPrime) { return !needPrime | isPrime(value); } public boolean verify(int value, boolean needPrime) { return !needPrime || isPrime(value); }
在第一个版本中,|将始终对的两个操作数进行求值,因此isPrime将不必要地调用(expensive)方法。第二个版本通过使用||代替来避免不必要的调用|。