java - 为什么我应该总是使用 ||而不是 |和 && 而不是 &?

标签 java boolean operators bit-manipulation conditional-statements

自从我开始编程 Java 以来,我注意到每个人都在使用 &&|| 而不是 &| 。这是什么原因?我一直在使用 &&|| 因为我不知道你可以使用 &|。

class A{static{
  boolean t = true;
  boolean f = false;
  System.out.println("&ff " + (f&&f) + " " + (f&f));
  System.out.println("&ft " + (f&&t) + " " + (f&t));
  System.out.println("&tf " + (t&&f) + " " + (t&f));
  System.out.println("&tt " + (t&&t) + " " + (t&t));
  System.out.println("|ff " + (f||f) + " " + (f|f));
  System.out.println("|ft " + (f||t) + " " + (f|t));
  System.out.println("|tf " + (t||f) + " " + (t|f));
  System.out.println("|tt " + (t||t) + " " + (t|t));
}}

据我所知,它们是相同的:

$ javac A.java && java A
&ff false false
&ft false false
&tf false false
&tt true true
|ff false false
|ft true true
|tf true true
|tt true true
Exception in thread "main" java.lang.NoSuchMethodError: main

使用 ||&& 是否以任何方式改进我的代码?


作为一个简单的测试,我用缩写形式替换了数百次,我的所有单元测试仍然通过。

最佳答案

||&& 使用 short circuit evaluation

来自 same article

Short-circuit evaluation, minimal evaluation, or McCarthy evaluation denotes the semantics of some Boolean operators in some programming languages in which the second argument is only executed or evaluated if the first argument does not suffice to determine the value of the expression

假设您有一个对象,如果您这样做,您想要检查其属性之一的某个值:

if(obj != null & obj.ID == 1)

如果您的对象 obj 为空,您将得到一个空引用异常,因为您使用了单个 &,第一个条件评估为 false ,但它仍会继续下一个条件并引发空引用异常。

如果您使用 && 那么第二个条件将永远不会被评估,因此也不异常(exception)。

if(obj != null && obj.ID == 1)

对于您的代码,您不会看到任何差异,但是在多个条件下使用按位 |& 根本不会导致短路。

更多解释。


假设您遵循以下代码:

Boolean conditionA = 2 > 1; //some condition which returns true
if(conditionA | obj.SomeTimeConsumingMethod()){

}

现在在上面的代码片段中,假设您有一个带有方法 SomeTimeConsumingMethod 的对象,该方法在处理过程中花费大量时间并返回 truefalse。如果您使用单个 | 它会评估两个条件,因为第一个 conditionAtrue 它会处理 obj.SomeTimeConsumingMethod 同样。由于使用了 | (OR),整个 if 语句的最终结果将为 true

如果您的条件使用双 || (或逻辑运算符)

if(conditionA || obj.SomeTimeConsumingMethod())

那么第二个条件 obj.SomeTimeConsumingMethod() 将不会被评估。这是短路,只是让您免于执行一些耗时的方法。无论 obj.SomeTimeConsumingMethod() 返回什么,最终结果仍然是 true

关于java - 为什么我应该总是使用 ||而不是 |和 && 而不是 &?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20152617/

相关文章:

java - 如何在java中修改xml-stylesheet属性值

java - 如何使用 FXML 和 JavaFX 动态创建 TextFlow 时保留新行字符

java - 找不到 ID 为 'org.springframework.boot' 的插件

swift - 如何在按下按钮后使图片出现在单元格中

javascript - 添加 FOR LOOP JavaScript 后 BOOLEAN 不起作用

JavaScript 整数

java - 为什么 Wildfly 在后续调用之间会抛出 NoSuchEJBException?

python - Pandas 数据帧阈值——如果超过则保持数字固定

c++ - 了解运营商

c# - |=(单管道等于)和&=(单&符号等于)是什么意思