Java: Почему классы обертки необходимы?

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

30
задан Sasi Kathimanda 4 September 2016 в 04:46
поделиться

6 ответов

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

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

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

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

18
ответ дан 27 November 2019 в 23:32
поделиться

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

3
ответ дан 27 November 2019 в 23:32
поделиться

Ну, причина в том, что коллекции Java не различаются между примитивным и объектом. Это обрабатывает их все как объект, и поэтому ему понадобится обертка. Вы можете легко построить свой собственный класс для сбора, который не нуждается в оболочке, но в конце концов вам придется построить один для каждого типа CHAR, INT, FLOAT, Double и т. Д. Умножьте типы коллекций (набор, карта, Список, + их реализация).

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

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

1
ответ дан 27 November 2019 в 23:32
поделиться

на самом деле не совсем ужасная идея. Это имеет по крайней мере такой же смысл, как и то, как это работает сейчас (что даровано, не так много). Я думаю, основная проблема заключается в том, что классы - это не единица компиляции и связывания, а «единицы перевода». Но делать это класс за классом гораздо чище, имея классы быть модулями, как на Java или C # или других языках, которые имеют больше смысла.

-121--2267764-

Не могли бы вы сделать typedef gee:: whiz:: abc:: def:: Hello Hello ?

-121--2267763-

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

4
ответ дан 27 November 2019 в 23:32
поделиться

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

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

Если вы хотите детали Nitty Gritty, это в значительной степени сводится к следующим образом:

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

37
ответ дан 27 November 2019 в 23:32
поделиться
-

См.

Бокс и распаковка: когда он придет?

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

1
ответ дан 27 November 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: