На очень высоком уровне я знаю, что мы должны "перенести" примитивные типы данных, такие как интервал и символ, при помощи их соответствующих классов обертки для использования их в наборах Java. Я хотел бы понять, как наборы Java работают на низком уровне путем выяснения: "почему мы должны перенести примитивные типы данных как объекты смочь использовать их в наборах? "Я заранее благодарю Вас за Вашу справку.
На уровне виртуальной машины это потому, что примитивные типы представляются очень по-разному в памяти по сравнению с типовыми типами, такими как Java.lang.Object и его полученные типы. Примитивный INT в Java, например, составляет всего 4 байта в памяти, в то время как объект занимает минимум 8 байтов, а также еще один 4 байта для его ссылки на его. Такой дизайн - это простое отражение того факта, что процессоры могут лечить примитивные типы гораздо более эффективно.
Так что один ответ на ваш вопрос «Почему необходимы типы обертки» - это из-за улучшения производительности, которое оно позволяет.
Но для программистов такое различие добавляет некоторые нежелательные когнитивные накладные расходы (например, не могут использовать int и float в коллекциях.) На самом деле, вполне возможно сделать дизайн языка, скрываясь к этому различию --- многие языки сценариев делают Это и CLR делает это. Начиная 1,5, Java делает это тоже. Это достигается, позволяя компилятору тихо вставить необходимое преобразование между примитивным представлением и представлением объекта (которое обычно называется боксом / неборочной обработкой.)
Так что другой ответ на ваш вопрос: «Нет, нам это не нужно» , потому что компилятор делает это автоматически для вас, и в определенную степень вы можете забыть, что происходит за сценой.
Примитивные типы данных не могут быть упоминаются как адреса памяти. Вот почему нам нужны обертки, которые служат заполнителями для примитивных ценностей. Эти значения могут быть мутированы и доступны, реорганизованы, отсортированы или рандомизированы.
Ну, причина в том, что коллекции Java не различаются между примитивным и объектом. Это обрабатывает их все как объект, и поэтому ему понадобится обертка. Вы можете легко построить свой собственный класс для сбора, который не нуждается в оболочке, но в конце концов вам придется построить один для каждого типа CHAR, INT, FLOAT, Double и т. Д. Умножьте типы коллекций (набор, карта, Список, + их реализация).
Можете ли вы представить, как это будет скучно?
И дело в том, что производительность, которую он приносит, используя обертку, почти незначительна для большинства приложений. Тем не менее, если вам нужна очень высокая производительность, также доступны некоторые библиотеки для примитивных коллекций (например, http://www.joda.org/joda-primitives/ )
на самом деле не совсем ужасная идея. Это имеет по крайней мере такой же смысл, как и то, как это работает сейчас (что даровано, не так много). Я думаю, основная проблема заключается в том, что классы - это не единица компиляции и связывания, а «единицы перевода». Но делать это класс за классом гораздо чище, имея классы быть модулями, как на Java или C # или других языках, которые имеют больше смысла.
-121--2267764- Не могли бы вы сделать typedef gee:: whiz:: abc:: def:: Hello Hello
?
Для хранения значений примитивного типа в классах сбора требуется класс Wrapper.
Поскольку коллекции Java могут хранить только ссылки на объекты (поэтому вам нужно вставлять примитивы для хранения их в коллекциях).
Прочитайте эту короткую статью на AutoBoxing для получения дополнительной информации.
Если вы хотите детали Nitty Gritty, это в значительной степени сводится к следующим образом:
локальные примитивы хранятся в стеке. Коллекции хранят свои значения по ссылке на местоположение памяти объекта в куче. Чтобы получить эту ссылку на локальную примибильную, вы должны иметь вставку (принять значение в стеке и обернуть его для хранения на куче) значение.
См.
Бокс и распаковка: когда он придет?
Это для C #, но ту же концепция применяется к Java. И Джон Скелет написал ответ.