-
發生了什麼事
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 -
Типы-обертки для примитивных типов
mutable
orimmutable
?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