条件和条件或运算符(和)

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 方法。第二个版本通过使用||而不是|来避免不必要的调用。