2011-12-20 1206 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()) - 只是一次