?:三元运算符中的Map.get()优化

时间:2011-12-14 14:42:05

标签: java optimization map compiler-optimization

请考虑以下代码:

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";

) ?

3 个答案:

答案 0 :(得分:6)

不确定您是否在询问哪个与编译器对原始表达式的对应关系,在这种情况下答案是:

既不 -

在示例中,您将调用map.get()两次;编译器无法知道没有副作用,因此在找到值时会调用它两次。

可能最接近

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

或者,如果您问的是哪种方案最有效,那么答案是:

第二种选择可能稍好一些,因为它不需要额外的局部变量。一个额外的局部变量会给JVM带来轻微的开销,但是一旦JIT通过它,它在运行时可能就没什么了。

答案 1 :(得分:3)

你的第二个选择是:

String value = map.get(key);
if(value == null) {
    value = "DEFAULT_VALUE";
}
从第一个原因开始,

更好:

  1. 您不会创建额外的引用“tmp”

  2. 在执行三元比较时,您不执行其他操作。

答案 2 :(得分:0)

IF最好。

更具可读性和可读性自我解释。

此外:执行时间不是什么大问题,至少在这里。