-
Co się stało
autoboxing
?Autoboxing to mechanizm niejawnej inicjalizacji obiektów klas opakowań (Byte, Short, Character, Integer, Long, Float, Double) wartościami odpowiadających im oryginalnych typów pierwotnych (odpowiednio , , , , , ,
byte
,short
)char
,int
bezlong
jawnefloat
użyciedouble
konstruktora klasy.Autoboxing ma miejsce, gdy element podstawowy jest bezpośrednio przypisany do klasy opakowania (za pomocą
=
operatora „ ”) lub gdy element podstawowy jest przekazywany do parametrów metody (takich jak „klasa opakowania”). Zarówno zmienne typów pierwotnych, jak i stałe czasu kompilacji (literały ifinal
-prymitywy) mogą być automatycznie pakowane w „klasy opakowujące”. W tym przypadku literały muszą być poprawne składniowo, aby zainicjować zmienną pierwotnego typu pierwotnego.Autoboxing zmiennych typów pierwotnych wymaga dokładnego dopasowania typu pierwotnego prymitywu - typu „klasy opakowania”. Na przykład próba automatycznego włączenia zmiennej typu
byte
doShort
bez uprzedniego jawnego rzutowaniabyte->short
spowoduje błąd kompilacji.Automatyczne pakowanie stałych typu pierwotnego pozwala na szersze dopasowanie. W takim przypadku kompilator jest w stanie z wyprzedzeniem wykonać niejawne rozszerzanie/zawężanie typów pierwotnych. Transformacja przebiega w dwóch etapach:
-
niejawne rozwinięcie (zawężenie) oryginalnego typu pierwotnego do typu pierwotnego odpowiadającego klasie opakowania (w celu konwersji
int->Byte
najpierw kompilator domyślnie zawęża sięint
dobyte
) -
automatyczne pakowanie prymitywu do odpowiedniej „klasy opakowania” (kompilator autopakuje
byte->Byte
). jednak w tym przypadku istnieją dwa dodatkowe ograniczenia: -
przypisanie prymitywu do „opakowania” można wykonać tylko za pomocą
=
operatora „ ” (nie można przekazać takiego prymitywu do parametrów metody bez jawnego rzutowania typu) -
typ lewego operandu nie może być starszy niż
Character
, typ prawego operandu nie może być starszy niżint
, (dozwolone jest rozszerzanie/zawężaniebyte <-> short
,byte <-> char
,short <-> char
i tylko zawężaniebyte <- int
,short <- int
,char <- int
, wszystkie inne opcje wymagają jawnego rzutowania typu)
Dodatkową cechą całkowitych „klas opakowań” utworzonych przez stałe autoboxingu z zakresu -128 +127 jest to, że są one buforowane przez maszynę JVM. Dlatego takie wrappery o tych samych wartościach będą referencjami do jednego obiektu.
-
-
Dlaczego jest używany
autoboxing
?Zacytuję wykład:
Jak pamiętasz, w Javie oba typy są dziedziczone z klasy
Object
i typów pierwotnych. Ale, jak się okazało, tak wygodna rzecz, jak kolekcje i typy generyczne, może działać tylko z typami odziedziczonymi zObject
. -
Альтернативы
autoboxing
?Не нашел ответа, но запостил на StackOverFlow.
Исходя из этой дискуссии, получается, что альтернатива
autoboxing
`у это использование примитивных типов, так Jak использовниеautoboxing
`a снижает производительность. Вывод: использоватьautoboxing
только там где это необходимо.Написана статья про
Autoboxing
: Autoboxing: Traps and Advantages -
Типы-обертки для примитивных типов
mutable
Lubimmutable
?Immutable
, так Jak примитивные obiektы тожеimmutable
. Coбы работать Jak сMutable
типом есть классMutableInteger
, и.т.д. -
Как примитивные типы приводятся к непримитивным аналогам?
На этот и последующий вопросы хорошо отвечает вот эта статья: Автоупаковка и распаковка в Java
Это заключение из нее: автоупаковка является механизмом для скрытого преобразования примитивных типов данных в соответствующие классы-оболочки (obiektы). Компилятор использует метод
valueOf()
чтобы преобразовать примитивные типы в obiektы, а методыIntValue()
,doubleValue()
и т.д., чтобы получить примитивные типы из obiektа (то есть обратное преобразование). Автоупаковка преобразует логический типboolean
вBoolean
,byte
вByte
,char
вCharacter
,float
вFloat
,int
вInteger
,long
вLong
,short
вShort
. Распаковка происходит в обратном направлении. -
Как непримитивные типы приводятся к примитивным?
Выше ответил.
-
Как сравниваются примитивные и непримитивные типы?
В лекции это подробно рассматривается, но я нашел так скажем тоже самое, но другими словами.
В Java есть два способа сравнивать obiektы на równa sięство,
==
и методequals()
.==
используется для примитивных типов. Для obiektов «==
» это исключительно сравнение ссылок. Для остальных случаев нужно использовать методequals()
. Кроме того методhashCode()
служит (в теории) для той же цели. Хорошим тоном считается, если вы переопределLubequals()
иhashCode()
. После инициализации неких obiektов a и b должно выполняться правило:Если выражение
a.equals(b)
вернет true, тоa.hashCode()
должен быть równa sięb.hashCode()
. -
Всегда ли создается новый obiekt при операции
autoboxing
?Это в лекциях есть:
Когда мы присваиваем переменной типа Integer oznaczający типа
int
, при этом вызывается методInteger.valueOf
: функцияvalueOf
не всегда создает новый obiekt типа Integer. Она кэширует значения от -128 до 127.Если передаваемое oznaczający выходит за эти пределы, то новый obiekt создается, а если нет, то нет.
Если мы пишем
new Integer()
, то гарантированно создается новый obiekt. Если мы вызываемInteger.valueOf()
, явно Lub приautoboxing
, то этот метод может вернуть для нас Jak новый obiekt, так и отдать obiekt из кэша, если переданное число лежит в диапазоне от -128 до 127. -
Как работает кэширование при операции
autoboxing
?Ответил в вопросе выше, на всякий случай создал вопрос на StackOverFlow, но там отвечают тоже самое
-
Для Jakих типов и/Lub значений работает кэширование?
В восьмом вопросе. Если у кого – то есть соображения на тему трех последних вопросов, то напишите в комментариях.
DefNeo
Poziom 36
GO TO FULL VERSION