Когда следует использовать примитивы вместо обертывания объектов?
Фактически здесь является аналогичной темой, мало практической.
Насколько я понимаю, примитивы работают лучше и должны использоваться везде, кроме случаев, когда необходимы объекты, связанные с объектами (например, 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());
...
}
Бог был злым.