2011-12-14 115 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是优选的。

它更具可读性&自我解释。

另外:执行时间并不是什么大事,至少在这里。