Следует ли избегать автобокс в Java?

Существуют случаи, когда метод ожидает примитивный тип double и вы передаете объект Double в качестве параметра.

Поскольку компилятор распаковывает переданный объект, это увеличит использование памяти или уменьшит производительность?

Ответ 1

Это то, что Java Notes говорит о autoboxing:

Предпочитают примитивные типы

Используйте примитивные типы, где нет необходимости в объектах для двух причины.

  • Примитивные типы могут быть намного быстрее, чем соответствующая оболочка типы и никогда не замедляются.
  • Неизменяемость (не может быть изменена после создания) обертки типы могут сделать их использование невозможным.
  • Может быть какое-то неожиданное поведение с участием == (сравните ссылки) и .equals() (сравнить значения). См. Ссылку ниже для примеров.

Ответ 2

Правило большого пальца: всегда используйте примитивы, если это возможно.

Есть случаи, когда это невозможно, например, коллекции, поэтому используйте только обертки.

Ответ 3

Это дизайн-выбор, а не тривиальный ответ для каждого случая.

На ваше решение может повлиять несколько элементов:

Преимущества:

  • Авто-бокс и авто-распаковка могут сделать ваш код более удобным для чтения:

    Оставляя все ненужные .doubleValue() и Double.valueOf(), уменьшает визуальный шум и может сделать ваш код более легким для чтения.

  • Авто-бокс позволяет вам легко использовать коллекции примитивных значений (например, List<Double>,...)

Недостатки:

  • чрезмерное, ненужное автоматическое боксирование и автоматическая распаковка могут помешать вашей работе.

    Например, если у вас есть API, который возвращает double и другой API, который ожидает double, но вы обрабатываете значение в виде двойного промежутка между ними, тогда вы делаете бесполезный авто-бокс.

  • auto-unboxing может ввести NullPointerException, где вы этого не ожидаете:

    public void frobnicate(Double d) {
      double result = d / 2;
      // ...
    }
    
  • используя коллекции значений с автоматическим короблением, использует гораздо больше памяти, чем сопоставимый double[].

Ответ 4

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

Ответ 5

Следует избегать использования автобоксинга. Это может привести к ошибкам из-за перегрузки и имеет некоторое влияние на производительность. Тем не менее это может не быть проблемой в вашем приложении. Но имейте в виду воздействие.

Вот мое сообщение: https://effective-java.com/2010/05/the-advantages-and-traps-of-autoboxing/