Существуют случаи, когда метод ожидает примитивный тип double
и вы передаете объект Double
в качестве параметра.
Поскольку компилятор распаковывает переданный объект, это увеличит использование памяти или уменьшит производительность?
Существуют случаи, когда метод ожидает примитивный тип double
и вы передаете объект Double
в качестве параметра.
Поскольку компилятор распаковывает переданный объект, это увеличит использование памяти или уменьшит производительность?
Это то, что Java Notes говорит о autoboxing:
Предпочитают примитивные типы
Используйте примитивные типы, где нет необходимости в объектах для двух причины.
- Примитивные типы могут быть намного быстрее, чем соответствующая оболочка типы и никогда не замедляются.
- Неизменяемость (не может быть изменена после создания) обертки типы могут сделать их использование невозможным.
- Может быть какое-то неожиданное поведение с участием == (сравните ссылки) и .equals() (сравнить значения). См. Ссылку ниже для примеров.
Правило большого пальца: всегда используйте примитивы, если это возможно.
Есть случаи, когда это невозможно, например, коллекции, поэтому используйте только обертки.
Это дизайн-выбор, а не тривиальный ответ для каждого случая.
На ваше решение может повлиять несколько элементов:
Преимущества:
Авто-бокс и авто-распаковка могут сделать ваш код более удобным для чтения:
Оставляя все ненужные .doubleValue()
и Double.valueOf()
, уменьшает визуальный шум и может сделать ваш код более легким для чтения.
Авто-бокс позволяет вам легко использовать коллекции примитивных значений (например, List<Double>
,...)
Недостатки:
чрезмерное, ненужное автоматическое боксирование и автоматическая распаковка могут помешать вашей работе.
Например, если у вас есть API, который возвращает double
и другой API, который ожидает double
, но вы обрабатываете значение в виде двойного промежутка между ними, тогда вы делаете бесполезный авто-бокс.
auto-unboxing может ввести NullPointerException
, где вы этого не ожидаете:
public void frobnicate(Double d) {
double result = d / 2;
// ...
}
используя коллекции значений с автоматическим короблением, использует гораздо больше памяти, чем сопоставимый double[]
.
Вам не нужно избегать автобоксинга, если говорить о производительности, JVM должен это обработать. Единственное, что вы должны учитывать, это читаемость вашего кода.
Следует избегать использования автобоксинга. Это может привести к ошибкам из-за перегрузки и имеет некоторое влияние на производительность. Тем не менее это может не быть проблемой в вашем приложении. Но имейте в виду воздействие.
Вот мое сообщение: https://effective-java.com/2010/05/the-advantages-and-traps-of-autoboxing/