-
發生了什麼事
autoboxing?自動裝箱
byte是一種用其對應的原始基本型別(分別為 、 、 、 、 、 、 、)的值隱式初始化包裝類別(Byte、Short、Character、Integer、Long、Float、Double)物件的機制short,char而int無需long明確float使用double類別建構函數。當原語直接指派給包裝類別(使用「
=」運算子)時,或將原語傳遞到方法的參數(例如「包裝類別」)時,就會發生自動裝箱。基元類型的變數和編譯時常數(文字和final基元)都可以自動打包到「包裝類別」中。在這種情況下,文字必須在語法上正確才能初始化原始基本類型的變數。原始類型變數的自動裝箱需要與原始原始類型(「包裝類別」的類型)完全匹配。例如,嘗試將類型變數自動裝箱
byte到 中Short而不先進行明確轉換,byte->short將導致編譯錯誤。原始類型常數的自動裝箱允許更寬的匹配邊界。在這種情況下,編譯器能夠提前執行基元類型的隱式擴展/縮小。轉變發生在兩個階段:
-
將原始基元類型隱式擴展(縮小)為包裝類別對應的基元類型(對於轉換
int->Byte,首先編譯器隱含縮小int為byte) -
將原語自動打包到適當的「包裝類別」(編譯器自動打包
byte->Byte)。但是,在這種情況下還有兩個額外的限制: -
將原語指派給「包裝器」只能使用「
=」運算子來完成(如果沒有明確型別轉換,則無法將這樣的原語傳遞給方法參數) -
左操作數的類型不得早於
Character,右操作數的類型不得早於int, (允許擴展/收縮byte <-> short,byte <-> char,short <-> char
並且僅縮小byte <- int,short <- int,char <- int,所有其他選項都需要顯式類型轉換)
由 -128 +127 範圍內的自動裝箱常數所建立的整數「包裝類別」的另一個功能是它們由 JVM 快取。因此,此類具有相同值的包裝器將是對一個物件的參考。
-
-
為什麼要使用它
autoboxing?我引用一下演講內容:
正如您所記得的,Java 既有從類別繼承的類型
Object,也有原始類型。但是,事實證明,像集合和泛型這樣方便的東西只能與繼承自 的類型一起使用Object。 -
Альтернативы
autoboxing?Не нашел ответа, но запостил на StackOverFlow.
Исходя из этой дискуссии, получается, что альтернатива
autoboxing`у это использование примитивных типов, так How использовниеautoboxing`a снижает производительность. Вывод: использоватьautoboxingтолько там где это необходимо.Написана статья про
Autoboxing: Autoboxing: Traps and Advantages -
Типы-обертки для примитивных типов
mutableorimmutable?Immutable, так How примитивные an objectы тожеimmutable. Whatбы работать How сMutableтипом есть классMutableInteger, и.т.д. -
Как примитивные типы приводятся к непримитивным аналогам?
На этот и последующий вопросы хорошо отвечает вот эта статья: Автоупаковка и распаковка в Java
Это заключение из нее: автоупаковка является механизмом для скрытого преобразования примитивных типов данных в соответствующие классы-оболочки (an objectы). Компилятор использует метод
valueOf()чтобы преобразовать примитивные типы в an objectы, а методыIntValue(),doubleValue()и т.д., чтобы получить примитивные типы из an object (то есть обратное преобразование). Автоупаковка преобразует логический типbooleanвBoolean,byteвByte,charвCharacter,floatвFloat,intвInteger,longвLong,shortвShort. Распаковка происходит в обратном направлении. -
Как непримитивные типы приводятся к примитивным?
Выше ответил.
-
Как сравниваются примитивные и непримитивные типы?
В лекции это подробно рассматривается, но я нашел так скажем тоже самое, но другими словами.
В Java есть два способа сравнивать an objectы на equalsство,
==и методequals().==используется для примитивных типов. Для an objectов «==» это исключительно сравнение ссылок. Для остальных случаев нужно использовать методequals(). Кроме того методhashCode()служит (в теории) для той же цели. Хорошим тоном считается, если вы переопределorequals()иhashCode(). После инициализации неких an objectов a и b должно выполняться правило:Если выражение
a.equals(b)вернет true, тоa.hashCode()должен быть equalsb.hashCode(). -
Всегда ли создается новый an object при операции
autoboxing?Это в лекциях есть:
Когда мы присваиваем переменной типа Integer meaning типа
int, при этом вызывается методInteger.valueOf: функцияvalueOfне всегда создает новый an object типа Integer. Она кэширует значения от -128 до 127.Если передаваемое meaning выходит за эти пределы, то новый an object создается, а если нет, то нет.
Если мы пишем
new Integer(), то гарантированно создается новый an object. Если мы вызываемInteger.valueOf(), явно or приautoboxing, то этот метод может вернуть для нас How новый an object, так и отдать an object из кэша, если переданное число лежит в диапазоне от -128 до 127. -
Как работает кэширование при операции
autoboxing?Ответил в вопросе выше, на всякий случай создал вопрос на StackOverFlow, но там отвечают тоже самое
-
Для Howих типов и/or значений работает кэширование?
В восьмом вопросе. Если у кого – то есть соображения на тему трех последних вопросов, то напишите в комментариях.
DefNeo
等級 36
GO TO FULL VERSION