Java条件和和条件或运算符(&&和||)

示例

Java提供了一个条件和运算符以及一个条件或运算符,它们都使用一个或两个类型的操作数boolean并产生boolean结果。这些是:

  • && -条件AND运算子,

  • ||-条件或运算符。的评估<left-expr> && <right-expr>等效于以下伪代码:

    {
      boolean L = evaluate(<left-expr>);
      if (L) {
          return evaluate(<right-expr>);
      } else {
          // 短路第二个操作数表达式的求值
          return false;
      }
    }

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