Java: зачем нужны классы-обертки? - PullRequest
29 голосов
/ 25 января 2010

На очень высоком уровне я знаю, что нам нужно "обернуть" примитивные типы данных, такие как int и char, используя их соответствующие классы-обертки, чтобы использовать их в коллекциях Java. Я хотел бы понять, как коллекции Java работать на низком уровне, спрашивая: «Зачем нам нужно оборачивать примитивные типы данных в объекты, чтобы иметь возможность использовать их в коллекциях?» Заранее благодарю за помощь.

Ответы [ 12 ]

35 голосов
/ 25 января 2010

Поскольку в коллекциях Java могут храниться только ссылки на объекты (поэтому для хранения их в коллекциях необходимо поместить примитивы).

Прочтите эту короткую статью по Автобокс для получения дополнительной информации.

Если вам нужны мелкие детали, все сводится к следующему:

Локальные примитивы хранятся в стеке.Коллекции хранят свои значения посредством ссылки на область памяти объекта в куче.Чтобы получить эту ссылку для локального примитива, вы должны поместить (взять значение в стеке и обернуть его для хранения в куче) значение.

19 голосов
/ 25 января 2010

На уровне виртуальной машины это происходит потому, что примитивные типы представляются в памяти очень по-разному по сравнению с ссылочными типами, такими как java.lang.Object и его производные типы. Примитив int в Java, например, занимает всего 4 байта в памяти, тогда как объект занимает минимум 8 байтов сам по себе, плюс еще 4 байта для ссылки на него. Такая конструкция является простым отражением того факта, что процессоры могут гораздо эффективнее обрабатывать примитивные типы.

Таким образом, один из ответов на ваш вопрос «зачем нужны типы оболочек» связан с улучшением производительности, которое он обеспечивает.

Но для программистов такое различие добавляет некоторые нежелательные когнитивные издержки (например, нельзя использовать int и float в коллекциях.) На самом деле, вполне возможно создать языковой дизайн, скрыв это различие - многие языки сценариев это, и CLR делает это. Начиная с 1.5, Java тоже это делает. Это достигается за счет того, что компилятор может молча вставлять необходимое преобразование между примитивным представлением и представлением объекта (которое обычно называют боксом / распаковкой).

Итак, еще один ответ на ваш вопрос: «Нет, нам это не нужно», потому что компилятор делает это автоматически для вас, и в определенной степени вы можете забыть, что происходит за кулисами.

4 голосов
/ 25 января 2010

Для хранения значений примитивных типов в классах коллекций нам требуется Wrapper classe.

3 голосов
/ 25 января 2010

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

2 голосов
/ 07 июня 2017

Прочитайте все ответы, но ни один из них на самом деле не объясняет это просто с точки зрения непрофессионала.

A обертка класс оборачивает (охватывает) вокруг типа данных (может быть любой примитивный тип данных, например int, char, byte, long) и делает его объектом .

Вот несколько причин, по которым нужны классы-оболочки:

  1. Позволяет null значения.
  2. Может использоваться в коллекции, например List, Map и т. Д.
  3. Может использоваться в методах, которые принимают аргументы типа Object.
  4. Можно создавать как объекты, используя new ClassName(), как и другие объекты:

    Integer wrapperInt = new Integer("10");
    
  5. Предоставляет доступ ко всем функциям класса Object, таким как clone(), equals(), hashCode(), toString() и т. Д.

Классы Wrapper могут быть созданы двумя способами:

  1. Использование конструктора:

    Integer i = new Integer("1"); //new object is created
    
  2. Использование valueOf() статических операторов:

     Integer i  = Integer.valueOf("100"); //100 is stored in variable
    

Рекомендуется использовать второй способ создания классов-оболочек, поскольку он требует меньше памяти, поскольку новый объект не создается.

1 голос
/ 17 августа 2013

Коллекция использует Generics в качестве основы. Collection Framework предназначен для сбора, хранения и обработки данных любого класса. Так что он использует универсальный тип. Используя Generics, он способен хранить данные ЛЮБОГО КЛАССА, имя которого вы указываете в его объявлении.

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

1 голос
/ 25 января 2010

Ну, причина в том, что коллекции Java не различают примитив и объект. Он обрабатывает их все как объект и, следовательно, ему понадобится оболочка. Вы можете легко создать свой собственный класс коллекции, который не нуждается в обертке, но в конце вам придется создать его для каждого типа char, int, float, double и т.д., умноженного на типы коллекций (Set, Map, Список, + их реализация).

Вы можете себе представить, как это скучно?

И факт в том, что производительность, которую он приносит без использования обертки, практически ничтожна для большинства приложений. Тем не менее, если вам нужна очень высокая производительность, некоторые библиотеки для примитивных коллекций также доступны (например, http://www.joda.org/joda-primitives/)

1 голос
/ 25 января 2010

См. Бокс и распаковка: когда это происходит?

Это для C #, но та же концепция применима и к Java. И Джон Скит написал ответ.

0 голосов
/ 30 января 2018

потому что int не принадлежит ни одному классу. мы конвертируем тип данных (int) в объект (Interger)

0 голосов
/ 19 марта 2017

Подобно классу String, Wrappers предоставляют дополнительные функциональные возможности и позволяют программисту сделать немного больше с процессом хранения данных. Таким же образом люди используют класс String как ....

String uglyString = "fUbAr"; String myStr = uglyString.toLower();

так же, они могут с Wrapper. Аналогичная идея.

Это в дополнение к проблеме печати коллекций / дженериков, упомянутой выше Бхаратом.

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