Когда я должен использовать примитивы вместо обертывания объектов? - PullRequest
14 голосов
/ 27 октября 2008

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

Ответы [ 5 ]

23 голосов
/ 27 октября 2008

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

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

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

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


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

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

10 голосов
/ 27 октября 2008

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

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

5 голосов
/ 27 октября 2008

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

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

1 голос
/ 27 октября 2008

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

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

Однажды я работал над проектом, который использовал примитивы (и доморощенный ORM) для доступа к базе данных:

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

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

 void persist(Foo foo){
     ...
     statement.setInt(15,foo.getXXX()==-1?null:foo.getXXX());
     ...
}

Боже, это было зло.

1 голос
/ 27 октября 2008

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

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