2011-12-14 113 views
1

考慮下面的代碼:Map.get()優化:三元運算

java.util.Map<String, String> map = new java.util.HashMap<String, String>(); 
... 
String key = "A"; 
String value = map.get(key) == null? "DEFAULT_VALUE" : map.get(key); // (1) 

編譯器優化類似於行(1)東西:

String tmp = map.get(key); 
String value = tmp == null? "DEFAULT_VALUE" : tmp; 

(或:

String value = map.get(key); 
if(value == null) value = "DEFAULT_VALUE"; 

) ?

+0

我親自做後者。它沒有太大的區別,但是我認爲後者獲勝的可讀性通常會更好。 (你也不會相信我遇到的人數不知道三元運算符是幹什麼的,所以一般情況下最好避免,除非它很清楚)。 – Thor84no 2011-12-14 14:45:31

+0

爲了執行該優化,優化器必須知道`map.get(key)`每次調用時都會返回相同的值(不需要對`map`或`key`進行任何干預更改)。 – Gabe 2011-12-14 14:46:14

+0

編譯器幾乎沒有優化,JIT會。此外,我總是贊成澄清微觀優化。 – helpermethod 2011-12-14 14:48:36

回答

6

不知道你是問這相當於什麼編譯器會使得原有的表達,在這種情況下,答案是:

Neither--

在您呼叫map.get的例子()兩次;編譯器無法知道沒有副作用,所以當找到一個值時它會調用它兩次。

大概是最接近

String tmp = map.get(key); 
String value; 
if (tmp == null) 
    value= "DEFAULT_VALUE"; 
else 
    value = map.get(key); 

或者,如果你問哪個方案是最有效的,在這種情況下,答案是:

第二個選擇可能是稍微好一點,因爲它不需要額外的局部變量。一個額外的局部變量在JVM上施加了一些額外的開銷,但是一旦JIT完成了,它可能在運行時就沒有任何作用。

String value = map.get(key); 
if(value == null) { 
    value = "DEFAULT_VALUE"; 
} 

是第一個原因,更好:

3

你這是第二個選項

  1. 你不創建一個額外的參考 「TMP」

  2. 你不執行其他哪些你做你的三元比較的一部分。

0

IF是優選的。

它更具可讀性&自我解釋。

另外:執行時間並不是什麼大事,至少在這裏。