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

kha*_*hik 2 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)
Run Code Online (Sandbox Code Playgroud)

编译器优化生产线(1)类似的东西:

String tmp = map.get(key);
String value = tmp == null? "DEFAULT_VALUE" : tmp;
Run Code Online (Sandbox Code Playgroud)

(或者:

String value = map.get(key);
if(value == null) value = "DEFAULT_VALUE";
Run Code Online (Sandbox Code Playgroud)

)?

ant*_*oft 7

不确定你是否在询问编译器将对原始表达式做什么,在这种情况下,答案是:

Neither--

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

可能最接近

String tmp = map.get(key);
String value;
if (tmp == null)
    value= "DEFAULT_VALUE";
else
    value = map.get(key);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 他要求进行优化,而不是完全等同.没有必要复制不需要的第二次调用来获取值. (2认同)