Во-первых, преимущество в производительности при использовании любого из них перед , скорее всего, слишком мало, чтобы быть актуальным. Простота кода / удобочитаемость / удобство сопровождения гораздо важнее ... в подавляющем большинстве случаев.
Ни один из примеров не связан с созданием Boolean
экземпляров. Теоретически возможно, что 3 из 4 вызовут инициализацию класса Boolean
... и что ваше приложение иначе не сделало бы этого. В этом крайне маловероятном событии все ваше приложение выделит 2 объекта, которые иначе не были бы выделены.
Этот будет равен или быстрее, чем все остальные, потому что это просто влечет за собой установку регистра в ноль.
boolean isItTrue(arg){
return true;
}
Взятый отдельно, он должен загружать статическую ссылку из памяти, а не обнулять регистр. Тем не менее, JIT-компилятор может быть в состоянии оптимизировать это в некоторых случаях.
Boolean isItTrue(arg){
return Boolean.TRUE;
}
На первый взгляд, это включает в себя вызов Boolean.valueOf(true)
для "упаковки" true
, но JIT-компилятор должен иметь возможность оптимизировать его под тот же код, что и предыдущий, вставляя вызов.
Boolean isItTrue(arg){
return true;
}
На первый взгляд, это вызов Boolean.booleanValue(Boolean.TRUE)
, чтобы "распаковать" Boolean
. Этот звонок может быть встроен. Также возможно, что JIT-компилятор может избежать загрузки ссылки на объект Boolean
и извлечения его поля значения.
boolean isItTrue(arg){
return Boolean.TRUE
}
Суть в том, что относительная производительность 4 альтернатив зависит от того, насколько успешным будет JIT-компилятор в оптимизации. Это будет зависеть от контекста, специфики JIT-компилятора, настроек JVM и так далее. В лучшем случае JIT-компилятор может (по крайней мере, теоретически) создать одинаковый (оптимальный) код для всех них.