Оптимизация Map.get () в?: Троичный оператор - PullRequest
1 голос
/ 14 декабря 2011

Рассмотрим следующий код:

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 ]

6 голосов
/ 14 декабря 2011

Не уверен, если вы спрашиваете, что соответствует тому, что компилятор сделает из исходного выражения, и в этом случае ответ будет:

Ни то, ни другое -

В примере, который вы вызываетеmap.get () дважды;компилятор не может знать, что побочных эффектов нет, поэтому он вызовет его дважды, когда будет найдено значение.

Возможно, ближайший к

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

Или если вы спрашиваете, какая альтернативанаиболее эффективен, и в этом случае ответ:

Второй вариант, вероятно, немного лучше, потому что он не требует дополнительной локальной переменной.Дополнительная локальная переменная накладывает небольшие издержки на JVM, но, вероятно, она ничего не даст во время выполнения, как только JIT справится с этим.

3 голосов
/ 14 декабря 2011

Ваш второй вариант:

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

лучше по первой причине:

  1. Вы не создаете дополнительную ссылку "tmp"

  2. Вы больше не выполняете то, что делаете в рамках своего троичного сравнения.

0 голосов
/ 14 декабря 2011

IF один предпочтительнее.

Это более читабельно и самоочевидно.

Дополнительно: время выполнения не имеет большого значения, по крайней мере, здесь.

...