2011-12-20 72 views
5

可以说我有这样的:如何JAVA处理内单个多个条件IF语句

if(bool1 && bool2 && bool3) { 
... 
} 

现在。如果bool1被评估为false,Java是否足够聪明以跳过检查bool2和bool2? java甚至从左到右检查它们吗? 我在问这个问题,因为我正在“分类”我的if内部的条件,直到它们完成所需的时间(从左边最便宜的那个开始)。现在我不确定这是否会给我带来任何性能好处,因为我不知道Java如何处理这个问题。

+0

由于您试图通过这些更改来提高性能,您是否尝试过在移动条件之前和之后测量性能?一方面,它应该告诉你,这个逻辑是否真的被短路,如下所述,另一方面,它会告诉你这些变化的幅度是否在更大的情况下是显着的。 – Douglas 2011-12-20 09:31:16

回答

19

是,爪哇(类似于其他主流语言)使用 懒评价 短路,这意味着它少计算越好。

这意味着下面的代码是完全安全的:

if(p != null && p.getAge() > 10) 

此外,a || b从不计算b如果a计算结果为true

+2

抱歉挖掘旧线程,但为什么你有“&&和”?你的意思是“&&”? – 2014-08-26 17:40:14

4

是的,这就是所谓的短路。

请看看这个维基百科页面上short-circuiting

12

如果bool1被评估为false,Java是否足够智能地跳过检查bool2和bool2?

它不是一个聪明的事情,它是一个在语言中指定的要求。否则,你不能写表达式。

if(s != null && s.length() > 0) 

if(s == null || s.length() == 0) 

顺便说一句,如果你使用&|它将始终计算表达式的两侧。

6

look up在Java中(同样适用于|||&&&之间的差异。

&|只是逻辑运算符,而&&||条件逻辑运算符,它在你的例子意味着

if(bool1 && bool2 && bool3) { 

将跳过bool2bool3如果bool1是假的,

if(bool1 & bool2 & bool3) { 

将评估所有条件,而不考虑其值。

例如,给定:

boolean foo() { 
    System.out.println("foo"); 
    return true; 
} 

if(foo() | foo())将打印foo两次,并if(foo() || foo()) - 只是一次