&& (AND) 和 ||(OR) 在 IF 语句中

2022-08-31 07:36:40

我有以下代码:

if(!partialHits.get(req_nr).containsKey(z) || partialHits.get(req_nr).get(z) < tmpmap.get(z)){  
    partialHits.get(z).put(z, tmpmap.get(z));  
}

其中 是哈希映射。
如果第一个语句为真会发生什么?Java 是否仍会检查第二个语句?因为为了使第一个语句为真,HashMap不应该包含给定的键,所以如果检查第二个语句,我将得到.
所以简单来说,如果我们有以下代码partialHitsNullPointerException

if(a && b)  
if(a || b)

Java会检查在第一种情况下是否为假,在第二种情况下是否为真?baa


答案 1

不,它不会被评估。这是非常有用的。例如,如果需要测试 String 是否为 null 或为空,则可以编写:

if (str != null && !str.isEmpty()) {
  doSomethingWith(str.charAt(0));
}

或者,反之亦然

if (str == null || str.isEmpty()) {
  complainAboutUnusableString();
} else {
  doSomethingWith(str.charAt(0));
}

如果我们在Java中没有“短路”,我们将在上面的代码行中收到很多NullPointerExceptions。


答案 2

Java 有 5 种不同的布尔比较运算符:&, &&, |, ||, ^

& 和 && 是 “and” 运算符,|和||“or” 运算符,^ 是 “xor”

在检查参数的值之前,单个参数将检查每个参数,而不考虑值。双精度参数将首先检查左侧参数及其值,如果 () 或 () 不触及第二个参数。声音编译?一个简单的例子应该很清楚:true||false&&

给出所有示例:

 String aString = null;

和:

 if (aString != null & aString.equals("lala"))

在完成评估之前,将检查这两个参数,并将为第二个参数引发 NullPointerException。

 if (aString != null && aString.equals("lala"))

检查第一个参数并返回 ,因此不会检查第二个参数,因为结果无论如何都是。falsefalse

与 OR 相同:

 if (aString == null | !aString.equals("lala"))

也会提高NullPointerException。

 if (aString == null || !aString.equals("lala"))

检查第一个参数并返回 ,因此不会检查第二个参数,因为结果无论如何都是。truetrue

XOR 无法进行优化,因为它取决于这两个参数。


推荐