Я написал пример:
public class Demo {
Map<String, Boolean> map = new HashMap<>();
void primitive() {
map.put("a", true);
}
void object() {
map.put("b", Boolean.TRUE);
}
}
посмотреть на байткод из primitive()
0 aload_0
1 getfield #17 <Demo/map Ljava/util/Map;>
4 ldC#24 <a>
6 iconst_1
7 invokestatiC#26 <java/lang/Boolean/valueOf(Z)Ljava/lang/Boolean;>
10 invokeinterface #32 <java/util/Map/put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;> count 3
15 pop
16 return
и байткод из object()
0 aload_0
1 getfield #17 <Demo/map Ljava/util/Map;>
4 ldC#39 <b>
6 getstatiC#41 <java/lang/Boolean/TRUE Ljava/lang/Boolean;>
9 invokeinterface #32 <java/util/Map/put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;> count 3
14 pop
15 return
Вывод:
при использовании примитива есть дополнительный шаг, вызывающий Boolean.valueOf()
, но если вы часто запускаете этот фрагмент кода, компилятор JIT выполнит свою работу и оптимизирует ее.
Я бы сказал, что компилятор достаточно умен, так любой из них будет иметь тот же эффект. - Мы могли бы пройти тест. – acdcjunior
Либо что сказал @acdcjunior, либо во время выполнения JIT это выяснит. Итак, никакого реального интереса в конечном счете. – fge
Только что проверено через 'javap' из Oracles, и, good or no good,' map.put ("doesntMatter", true) 'преобразуется в' map.put ("doesntMatter", Boolean.valueOf (1)) '. Таким образом, он генерирует одну дополнительную инструкцию (которая толкает «1» в стек перед вызовом метода «valueOf») и использует 'invokestatic' вместо' getstatic' (используется в первом заявлении). Мне сложно сделать какие-либо выводы из этого (потому что JIT войдет в игру, когда придет реальное время, а разные компиляторы генерируют разные байт-коды), но то, что я только что описал, - это то, что на самом деле происходит с «javac» и «javap» Oracle '. – acdcjunior