让我说我有这个:
if(bool1 && bool2 && bool3) {
...
}
现在。如果bool1被评估为false,Java是否足够聪明,可以跳过检查bool2和bool2? java甚至从左到右检查它们? 我问这个是因为我正在“排序”我的if中的条件到它们所需要的时间(从左边最便宜的那个开始)。现在我不确定这是否给了我任何性能上的好处,因为我不知道Java如何处理这个问题。
答案 0 :(得分:30)
是的,Java(与其他主流语言类似)使用 懒惰评估 短路,这意味着它的评估尽可能少。
这意味着以下代码是完全安全的:
if(p != null && p.getAge() > 10)
此外,如果a || b
评估为b
,则a
永远不会评估true
。
答案 1 :(得分:13)
如果bool1被评估为false,那么Java是否足够智能,可以跳过检查bool2和bool2?
这不是一个聪明的问题,它是语言中规定的要求。否则你不能写像。
这样的表达式if(s != null && s.length() > 0)
或
if(s == null || s.length() == 0)
顺便说一句,如果您使用&
和|
,它将始终评估表达式的两面。
答案 2 :(得分:7)
请look up Java中&
和&&
之间的差异(同样适用于|
和||
)。
&
和|
只是逻辑运算符,而&&
和||
是条件逻辑运算符,在你的例子中意味着
if(bool1 && bool2 && bool3) {
如果bool2
为false,将跳过bool3
和bool1
,
if(bool1 & bool2 & bool3) {
无论价值如何,都会评估所有条件。
例如,给定:
boolean foo() {
System.out.println("foo");
return true;
}
if(foo() | foo())
将打印foo
两次和if(foo() || foo())
- 只需一次。
答案 3 :(得分:5)
是的,这称为短路。
上查看此维基百科页面