Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Map.get() optimization in ?: ternary operator

Consider the following code:

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)

Would the compiler optimize the line (1) something similar to:

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

(or to:

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

) ?

like image 377
khachik Avatar asked Feb 04 '26 12:02

khachik


2 Answers

Not sure if you are asking which corresponds to what the compiler will make of the original expression, in which case the answer is:

Neither--

In the example you are calling map.get() twice; the compiler can't know that there are no side effects, so it will call it twice when a value is found.

Probably closest to

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

Or if you are asking which alternative is most efficient, in which case the answer is:

The second alternative is probably slightly better because it does not require an additional local variable. An additional local variable imposes a slight overhead on the JVM, but it will probably amount to nothing at runtime once the JIT gets through with it.

like image 190
antlersoft Avatar answered Feb 06 '26 01:02

antlersoft


Your second option which is :

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

is better from first one reason:

  1. You dont create an extra reference "tmp"

  2. You dont execute else which you do as part of your ternary comparison.

like image 21
mprabhat Avatar answered Feb 06 '26 01:02

mprabhat