2011-01-04 3 views
10

Можно создать дубликат:
storing primitive values in a java collection?Коллекция Java. Почему нет примитивных типов?

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

ответ

2

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

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

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

+6

«Проблема с примитивными типами (по крайней мере, до Java 5)» ... и более поздними версиями. Несмотря на то, что в настоящее время существует авто-бокс, до сих пор нет базового класса для примитивных типов. –

5

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

1

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

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

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

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

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

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

7

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

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

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

0

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

1

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

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

Смежные вопросы