Сборники Java. Почему нет примитивных типов?

Возможный дубликат:
сохранение примитивных значений в коллекции java?

В моем учебнике Java говорится, что элементы коллекции, например ArrayList, не могут быть примитивными типами. Для этого есть причина? Я имею в виду, что кто-то в Sun решил это или есть какой-то барьер против этого? Я понимаю, что мой пример наполовину отвечает на мой вопрос, поскольку ArrayList требует, чтобы объект и примитивы не были объектами. Но тогда я думаю, почему они не могут иметь примитивные типы?

Ответ 1

есть ли какой-то барьер против это?

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

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

Ответ 2

Сохранение непривязанных примитивов резко усложнит код коллекций. Принимая во внимание, что с обертками (Integer для int и т.д.) Код довольно прямолинейный. В течение нескольких лет Java поддерживает "авто-бокс", а это означает, что если вы дадите int, где ожидается Integer, int будет завершен в экземпляр Integer для вас (и наоборот) -versa).

Ответ 3

Существуют объекты, называемые "обертки", которые представляют все примитивные типы. Например, существует класс под названием Integer, который поддерживает int. Вы можете использовать примитивные обертки для хранения значений в коллекции.

Проблема с примитивными типами (по крайней мере, до Java 5) заключается в том, что они не распространяются на базовый класс Object. Все коллекции должны указывать класс для всех используемых ими методов - и они указывают Object, так как Object является базой всех классов.

Начиная с Java 5, вы обнаружите, что Java будет неявно переключаться между примитивом и соответствующим классом-оболочкой, когда вам это нужно. Это означает, что вы можете добавить int, или double и т.д. В коллекцию. VM автоматически обернет примитив в класс обертки для вас и поместит обертку в коллекцию.

Ответ 4

Прочитайте эту статью по википедии. Это может помочь: http://en.wikipedia.org/wiki/Object_type_(object-oriented_programming)#Autoboxing

В информатике тип объекта (объект обёртывания a.k.a.) является типом данных который используется в объектно-ориентированных программирование для обертывания неъектного типа чтобы он выглядел как динамический объект.

Некоторое объектно-ориентированное программирование языки делают различие между ссылки и типы значений, часто называемые объектами и не-объектами на платформах, где сложные типы значений не существует по таким причинам, как эффективность и синтаксис семантические проблемы. Например, Java примитивные классы обертки соответствующие каждому примитивному типу: Integer и int, Character и char, Поплавок и поплавок и т.д. Языки, подобные С++ имеют мало или вообще не имеют понятия ссылочный тип; таким образом, использование тип объекта малоинтересен.

Бокс - это процесс размещения примитивный тип внутри объекта, поэтому что примитив может быть использован как ссылочный объект. Например, списки могут иметь определенные методы, которые массивы возможно, нет, но список может также требуют, чтобы все его члены динамические объекты. В этом случае добавленная функциональность списка может быть недоступным для простого массива номера. Для более конкретного примера, в Java, LinkedList может изменить свой размер, но массив должен иметь фиксированный размер. Можно было бы LinkedList из ints, но LinkedList класс перечисляет только ссылки на динамические объектов - он не может перечислить примитив типы, которые являются типами значений.

Чтобы обойти это, ints можно вставить в коробку в целые числа, которые являются динамическими объектов, а затем добавляется в LinkedList из целых чисел. (Использование общих параметризованные типы, введенные в J2SE 5.0, этот тип представлен как LinkedList.) С другой стороны рука, С# не имеет примитивной обертки классов, но позволяет заниматься боксом любого тип значения, возвращающий общий объект ссылка.

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

Ответ 5

В настоящее время единственным способом хранения primitives непосредственно в коллекции является сбор для каждого примитивного типа, например. TIntArrayList.

Вероятно, вы обнаружите, что хотя ArrayList работает медленнее, чем при использовании примитивов, он достаточно быстр для 90%% случаев использования.

Ответ 6

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