Java如何处理单个IF语句中的多个条件

时间:2011-12-20 08:25:21

标签: java

让我说我有这个:

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

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

4 个答案:

答案 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,

将跳过bool3bool1

if(bool1 & bool2 & bool3) {
无论价值如何,

都会评估所有条件。

例如,给定:

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

if(foo() | foo())将打印foo 两次if(foo() || foo()) - 只需一次

答案 3 :(得分:5)

是的,这称为短路。

请在short-circuiting

上查看此维基百科页面