條件和條件或運算子(和)

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 方法。第二個版本通過使用||而不是|來避免不必要的呼叫。