Когда следует использовать примитивы вместо обертывания объектов?

Фактически здесь является аналогичной темой, мало практической. Насколько я понимаю, примитивы работают лучше и должны использоваться везде, кроме случаев, когда необходимы объекты, связанные с объектами (например, null check). Правильно?

Ответы

Ответ 1

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

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

Одним из следствий является: его по-прежнему не рекомендуется использовать autoboxing для научных вычислений. Например, код d = a * b + c использует классы Integer для a, b, c и d, а сгенерированный код - d.valueOf(a.intValue() * b.intValue() + c.intValue( )). Все эти вызовы методов имеют свои собственные накладные расходы, поэтому обычно рекомендуется использовать автобоксинг при необходимости для хранения примитивов в коллекциях.

И даже тогда, если у вас есть огромная коллекция Integer, обертывающая int, служебные данные могут предполагать более длительное время выполнения, до в 20 раз больше, так как описанный в этой статье.


Jb добавляет этот важный комментарий:

Также Wrapper.valueOf(примитив) использует пул оберток. Поэтому предпочтите Integer.valueOf(5) на новое целое число (5)

Ответ 2

Примитивы быстрее, когда они используются, поскольку перед использованием они должны быть распакованы; таким образом, для выполнения виртуальной машины есть дополнительный шаг. Например, чтобы выполнить арифметику в Integer, она должна быть сначала преобразована в int до того, как будет выполнена арифметика.

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

Ответ 3

да, примитивы быстрее объектов. Начиная с java 5, вы даже можете смешивать примитивы и объекты без ручного преобразования друг в друга. Механизм autoboxing заботится только об этом.

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

Ответ 4

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

Ответ 5

Если вам нужны хранимые примитивы в коллекциях, вы можете использовать commons-primitives.

Я предпочитаю использовать примитивы для оберток, только место, которое абсолютно необходимо, чтобы оболочки были классами сущностей. Базы данных поддерживают нули, поэтому сущности тоже должны.

Я когда-то работал над проектом, в котором в доступе к базе данных использовались примитивы (и homebrew ORM):

 class Foo{
    int xxx = -1;
 ...
 }

И тогда у вас было:

 void persist(Foo foo){
     ...
     statement.setInt(15,foo.getXXX()==-1?null:foo.getXXX());
     ...
}
Бог был злым.