条件和条件或运算符(和)
Java 提供了条件和条件或运算符,它们都采用 boolean
类型的一个或两个操作数并生成 boolean
结果。这些是:
-
&&
- 条件 AND 运算符, -
||
- 条件 OR 运算符。<left-expr> && <right-expr>
的评估等同于以下伪代码:{ boolean L = evaluate(<left-expr>); if (L) { return evaluate(<right-expr>); } else { // short-circuit the evaluation of the 2nd operand expression return false; } }
<left-expr> || <right-expr>
的评估等同于以下伪代码:
{
boolean L = evaluate(<left-expr>);
if (!L) {
return evaluate(<right-expr>);
} else {
// short-circuit the evaluation of the 2nd operand expression
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
。
在第二个版本中,我们添加了一个后卫测试。通过首先进行 value != null
测试来评估 value != null && value == 0
表达。如果 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
方法。第二个版本通过使用||
而不是|
来避免不必要的调用。