-
Nə baş verdi
autoboxing
?Avtoboksinq
byte
sarğı siniflərinin (Bayt, Qısa, Xarakter, Tam, Uzun, Float, Cüt) obyektlərinin müvafiq orijinal primitiv növlərinin (müvafiq olaraq, , , , , , , ,short
) dəyərləri ilə qeyri -müəyyən şəkildə inisiallaşdırılması mexanizmidirchar
. sinif konstruktorunun açıq istifadəsi .int
long
float
double
Avtoboksinq primitiv bilavasitə sarğı sinifinə təyin edildikdə ("
=
" operatorundan istifadə etməklə) və ya primitiv metodun parametrlərinə (məsələn, "sarğı sinfi") ötürüldükdə baş verir. Həm primitiv tipli dəyişənlər, həm də kompilyasiya vaxtı sabitləri (literallar vəfinal
-primitivlər) avtomatik olaraq “sarğı siniflərinə” yığıla bilər. Bu halda, orijinal primitiv tipli dəyişəni işə salmaq üçün hərflər sintaktik cəhətdən düzgün olmalıdır.İbtidai tipli dəyişənlərin avtobokslanması orijinal primitivin növünə - "sarğı sinfinin" növünə dəqiq uyğunluğu tələb edir. Məsələn, bir növ dəyişənini ilk olaraq açıq yayım etmədən avtomatik qutuya
byte
daxil etməyə cəhd kompilyasiya xətasına səbəb olacaq.Short
byte->short
Primitiv tipli sabitlərin avtobokslanması daha geniş uyğunlaşma sərhədlərinə imkan verir. Bu halda kompilyator əvvəlcədən primitiv tiplərin gizli genişləndirilməsi/daraldılmasını həyata keçirə bilir. Transformasiya iki mərhələdə baş verir:
-
orijinal ibtidai növün sarğı sinifinə uyğun olan primitiv tipə gizli genişlənməsi (daralması) (çevirmə üçün
int->Byte
əvvəlcə tərtibçi dolayısı iləint
daralırbyte
) -
primitivin müvafiq “sarğı sinfi”nə avtomatik qablaşdırılması (tərtibçi avtomatik paketləyir
byte->Byte
). lakin bu halda iki əlavə məhdudiyyət var: -
primitivin “sarımlayıcıya” təyin edilməsi yalnız “
=
” operatorundan istifadə etməklə həyata keçirilə bilər (siz belə bir primitivi açıq tip tökmə olmadan metod parametrlərinə ötürə bilməzsiniz) -
sol operandın növü -dən köhnə olmamalıdır
Character
, sağ operandın növü , -dən köhnə olmamalıdırint
(genişləndirmə/daralmaya icazə verilir ,byte <-> short
,byte <-> char
vəshort <-> char
yalnız daralmabyte <- int
,short <- int
,char <- int
, bütün digər variantlar açıq tip tökmə tələb edir)
-128 +127 diapazonunda avtoboksinq sabitləri tərəfindən yaradılan tam ədəd "sarğı sinifləri"nin əlavə xüsusiyyəti onların JVM tərəfindən yaddaşda saxlanmasıdır. Buna görə də, eyni dəyərləri olan bu cür sarğılar bir obyektə istinad olacaqdır.
-
-
Niyə istifadə olunur
autoboxing
?Mühazirədən sitat gətirəcəyəm:
Xatırladığınız kimi, Java-da həm sinifdən miras qalmış növlər
Object
, həm də primitiv tiplər var. Ancaq məlum oldu ki, kolleksiyalar və generiklər kimi rahat bir şey yalnız miras qalmış növlərlə işləyə bilərObject
. -
Альтернативы
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
Səviyyə
GO TO FULL VERSION