什么是短路?用Java编程时如何使用短路?
可能重复:什么是短路?用Java编程时如何使用短路?,java,short,short-circuiting,Java,Short,Short Circuiting,可能重复: 前几天我错过了我的课堂讲座,我想知道是否有人能解释一下短路是什么,也许还有一个简单Java程序中使用短路的例子。谢谢你的帮助 短路:如果第一部分是真的,不要费心计算表达式的其余部分。同样的逻辑适用于false,如果&&也是短路短路表达式的计算意味着在找到其值之前只需要计算表达式的一部分。例如: a == null || a.size() == 0 如果a为null,则不会计算a.size()==0子表达式,因为如果布尔运算符|的一个操作数为true,则其计算结果为true 同样
前几天我错过了我的课堂讲座,我想知道是否有人能解释一下短路是什么,也许还有一个简单Java程序中使用短路的例子。谢谢你的帮助
短路
:如果第一部分是真的
,不要费心计算表达式的其余部分。同样的逻辑适用于false
,如果&&
也是短路短路表达式的计算意味着在找到其值之前只需要计算表达式的一部分。例如:
a == null || a.size() == 0
如果a
为null
,则不会计算a.size()==0
子表达式,因为如果布尔运算符|
的一个操作数为true
,则其计算结果为true
同样,对于此表达式:
a != null && a.size() > 0
如果a
为null
,则不会计算a.size()>0
,因为布尔运算符&
如果其一个操作数为false
,则计算结果为false
在上面的示例中,布尔运算符&&
和| |
被称为短路,因为如果第一个操作数的值足以确定整个表达式的值,则可能无法计算第二个操作数。比较而言,&
和|
操作数是等效的非短路布尔运算符。意味着在计算布尔表达式(逻辑和和或)时,只要找到满足或否定表达式的第一个条件,就可以停止运算
例如,假设您正在使用多个子表达式计算逻辑或,每个子表达式的计算成本都非常高:
if (costlyTest1() || costlyTest2() || costlyTest3()) { // ...
JVM可以在找到返回true
的函数后立即停止计算“costlyTest”函数,因为这将立即满足布尔表达式。因此,如果costlyTest1()
返回true,则将跳过其他测试。同样地:
if (costlyTest1() && costlyTest2() && costlyTest3()) { // ...
JVM可以在找到返回false
的函数后立即停止计算函数,因为这会立即否定表达式;因此,如果costlyTest1()
返回false,则不会调用其他函数
这些规则适用于布尔表达式的任何嵌套级别,可以利用这些规则来避免不必要的工作,如上面的示例所示。短路是指一旦确定表达式的结果,就停止对其求值。例如:
if (a == b || c == d || e == f) {
// Do something
}
如果a==b
为真,则c==d
和e==f
根本不计算,因为表达式的结果已经确定。如果a==b
为false,则计算c==d
;如果为真,则永远不会计算e==f
。这似乎没有什么区别,但请考虑:
if (foo() || bar() || baz()) {
// Do something
}
如果foo()
返回true,则不会调用bar
和baz
,因为表达式的结果已经确定。因此,如果bar
或baz
除了返回某些东西(副作用)之外还有其他作用,那么这些作用永远不会发生
短路的一个很好的例子与对象引用有关:
if (a != null && a.getFoo() != 42) {
// Do something
}
a.getFoo()
如果a
为null
,则通常会引发NullPointerException
,但因为表达式短路,如果a!=null
为false
,则a.getFoo()
部分从不发生,因此我们不会得到异常
请注意,并非所有表达式都短路。|
和&
运算符短路,但|
和&
不是,也不是*
或/
;事实上,大多数运算符都不是。短路是使用逻辑AND或or运算符(&或|)的另一种方法
e、 g.非短路或短路故障
if(false | true) {
}
第一个条件和第二个条件都会被计算,即使false不是true(它总是这样)
然而,它被写为短路或:
if(false || true) {
}
因为第一个条件为false,所以才对其进行计算,因为不是必需的,所以不计算true。更准确地说:一旦结果确定,就停止计算逻辑表达式。您刚才说Java只计算表达式的第一部分。@Jeffrey:我不理解您的评论。@user384706您说如果表达式的第一部分为true
,则任何表达式,然后它不计算表达式的其余部分。如果第一部分是假的,它也会做同样的事情。@Jeffrey:是的。如果(a&b)
如果a
是假的,那么其余部分,即b
不会被计算。同样地,如果(a | b)
如果a
是真的,那么其余部分,即b
不会被计算。错误在哪里?啊,我懂了。这很简单。谢谢你快速清晰的解释!