Тип объекта или примитива - PullRequest
5 голосов
/ 21 мая 2010

Может ли кто-нибудь объяснить мне использование Integer, Boolean и т. Д. Вместо их примитивных типов в JAVA?

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

Спасибо!

Ответы [ 4 ]

8 голосов
/ 21 мая 2010

Boolean, Integer, Long, ... являются объектами. Вы можете использовать их в местах, где вы не можете использовать примитивные типы, например

  • хранит их в коллекции как Map
  • используя их в качестве параметра шаблона
  • присваивая им null значение
  • используя их в более общем виде (например, Long как Number)

Примеры:

new ArrayList<Integer>();
Long id = null;
Number num = new Long( 3 );
4 голосов
/ 21 мая 2010

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

Также есть вещи, которые вы не можете сделать с примитивными типами, такие как хранение их на карте или использование полиморфизма (Double и Integer являются экземплярами Number).

4 голосов
/ 21 мая 2010

Обоснование для Integer, Boolean и т. Д. Состоит в том, чтобы разрешить использование примитивных типов в контекстах, которые требуют ссылочного типа. Классический вариант использования - это API-интерфейсы сбора, которые предоставляют наборы, списки, карты, очереди и т. Д., Где тип элемента должен быть некоторого ссылочного типа.

Таким образом я могу написать:

List<Integer> list = new ArrayList<Integer>();

но ошибка компиляции следующая:

List<int> list = new ArrayList<int>();

Обратите внимание, что этот сценарий использования для типов примитивных оболочек предшествует как универсальным типам, так и API-интерфейсам "новых" коллекций, и восходит к тем временам, когда единственными типами коллекций были исходные (предварительные) формы Vector и Hashtable, и их род.

1 голос
/ 21 мая 2010

примитивы всегда быстрее.
Однако бывают случаи, когда объекты действительно полезны:
1. апскейлинг. Ваша функция может принимать число (является родительским для всех числовых объектов: целое число, число с плавающей точкой и т. Д.) В качестве аргумента.
2. Возможное нулевое значение. Например, он используется при хранении в базе данных. Объект может быть нулевым, примитивы должны иметь значение. Так что, если поле в db обнуляемо, лучше использовать объектную версию примитивного значения.
3. если функция берет объект, а вы всегда задаете ему примитив, то есть расходы на автобокс (превращение примитива в объект). То же самое для возврата из функции.
4. У объектов есть определенные методы, такие как getHashcode (), toString () и т. Д., Которые в некоторых случаях могут быть действительно полезны.

...