什么是短路,在Java编程时如何使用它?

2022-09-01 05:00:49

可能的重复:
在布尔结果已知
后,java是否评估剩余条件 为什么我们通常使用|||,有什么区别?

前几天我错过了我的课堂讲座,我想知道是否有人可以解释什么是短路,也许是在一个简单的Java程序中使用它的例子。感谢您的帮助!


答案 1

短路是指表达式在确定其结果后立即停止计算的情况。例如:

if (a == b || c == d || e == f) {
    // Do something
}

如果为 true,则从不计算 ,因为表达式的结果已经确定。如果 为假,则进行评估;如果这是真的,那么永远不会被评估。这似乎没有任何区别,但请考虑:a == bc == de == fa == bc == de == f

if (foo() || bar() || baz()) {
    // Do something
}

如果返回 true,则永远不会调用 和,因为表达式的结果已经确定。因此,如果 或 具有其他效果,而不仅仅是返回某些内容(副作用),则这些效果永远不会发生。foo()barbazbarbaz

短路的一个很好的例子与对象引用有关:

if (a != null && a.getFoo() != 42) {
    // Do something
}

a.getFoo()通常会抛出一个 if are ,但是因为表达式短路,if 是 ,那么这个部分永远不会发生,所以我们没有得到异常。NullPointerExceptionanulla != nullfalsea.getFoo()

请注意,并非所有表达式都是短路的。和 运算符短路,但不是,也不是 或 ;事实上,大多数运营商都不是。||&&|&*/


答案 2

短路求值意味着在计算布尔表达式(逻辑和 )时,只要找到满足或否定表达式的第一个条件,就可以立即停止。ANDOR

例如,假设您正在使用多个子表达式计算逻辑,每个子表达式的计算成本都非常高:OR

if (costlyTest1() || costlyTest2() || costlyTest3()) { // ...

JVM 可以在找到返回函数后立即停止计算 “costlyTest” 函数,因为这将立即满足布尔表达式。因此,如果返回 true,则将跳过其他测试。同样地:truecostlyTest1()

if (costlyTest1() && costlyTest2() && costlyTest3()) { // ...

JVM 可以在找到返回函数后立即停止计算函数,因为这会立即否定表达式;因此,如果返回 false,则不会调用其他函数。falsecostlyTest1()

这些规则适用于布尔表达式的任何级别的嵌套,可以利用这些规则来避免不必要的工作,如上面的示例所示。


推荐