Следует ли избегать автобокс в Java? - PullRequest
12 голосов
/ 30 сентября 2011

В некоторых случаях метод ожидает тип примитива double и вы передаете объект Double в качестве параметра.

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

Ответы [ 5 ]

8 голосов
/ 30 сентября 2011

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

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

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

  1. Примитивные типы могут быть намного быстрее, чем соответствующая оболочка типы, и никогда не медленнее.
  2. неизменность (не может быть изменена после создания) оболочки типы могут сделать их использование невозможным.
  3. Может быть неожиданное поведение, связанное с == (сравните ссылки) и .equals () (сравнить значения). См ссылку ниже для примера.
6 голосов
/ 30 сентября 2011

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

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

5 голосов
/ 30 сентября 2011

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

Есть несколько пунктов, которые могут повлиять на ваше решение:

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

  • Автоматическая упаковка и автоматическая распаковка может сделать ваш код проще для чтения:

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

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

Недостатки:

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

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

  • автоматическая распаковка может ввести NullPointerException там, где вы этого не делаетеожидайте этого:

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

2 голосов
/ 30 сентября 2011

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

1 голос
/ 26 сентября 2014

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

Вот мой пост к этому: https://effective -java.com / 2010/05 / в-преимущества-и-ловушки-из-Autoboxing /

...