-
מה קרה
autoboxing
?אגרוף אוטומטי הוא מנגנון לאתחול מרומז של אובייקטים של מחלקות מעטפת (בייט, קצר, תווים, מספר שלם, ארוך, צף, כפול) עם הערכים של הסוגים הפרימיטיביים המקוריים המתאימים להם (בהתאמה, , , , , , , ,
byte
)short
,char
ללאint
. שימושlong
מפורש בבנאי המחלקה.float
double
אוטובוקס מתרחש כאשר פרימיטיבי מוקצה ישירות למחלקת עטיפה (באמצעות
=
האופרטור " "), או כאשר פרימיטיבי מועבר לפרמטרים של שיטה (כגון "מחלקה עטיפה"). שני משתנים מסוגים פרימיטיביים וקבועי זמן קומפילציה (מילוליים וfinal
-פרימיטיביים) ניתנים לאריזה אוטומטית ל"מחלקות עטיפה". במקרה זה, מילוליות חייבות להיות נכונות תחבירית כדי לאתחל משתנה מהסוג הפרימיטיבי המקורי.אחסון אוטומטי של משתנים מסוגים פרימיטיביים דורש התאמה מדויקת לסוג הפרימיטיבי המקורי - סוג "מחלקת העטיפה". לדוגמה, ניסיון לתרגם אוטומטית משתנה מסוג
byte
לתוךShort
, מבלי לבצע תחילה cast מפורש,byte->short
יגרום לשגיאת קומפילציה.אוטובוקס של קבועי סוג פרימיטיביים מאפשר גבולות התאמה רחבים יותר. במקרה זה, המהדר מסוגל לבצע הרחבה/צמצום מרומזים של טיפוסים פרימיטיביים מראש. השינוי מתרחש בשני שלבים:
-
הרחבה מרומזת (צמצום) של הסוג הפרימיטיבי המקורי לסוג הפרימיטיבי המתאים למחלקת ה-wrapper (להמרה
int->Byte
, ראשית המהדר מצטמצם באופן מרומזint
ל-byte
) -
אריזה אוטומטית של פרימיטיבי ל"מחלקת העטיפה" המתאימה (המהדר אורז אוטומטית
byte->Byte
). עם זאת, במקרה זה ישנן שתי הגבלות נוספות: -
הקצאת פרימיטיבי ל"עטיפה" יכולה להתבצע רק באמצעות
=
האופרטור " " (לא ניתן להעביר פרימיטיבי כזה לפרמטרים של שיטה ללא ליהוק סוג מפורש) -
סוג האופרנד השמאלי לא יכול להיות ישן יותר מ
Character
, סוג האופרנד הימני לא יכול להיות ישן יותר מint
, (מותרת הרחבה/התכווצותbyte <-> short
,byte <-> char
,short <-> char
ורק צמצוםbyte <- int
,short <- int
,char <- int
, כל שאר האפשרויות דורשות ליהוק סוג מפורש)
תכונה נוספת של "מחלקות עטיפה" של מספרים שלמים שנוצרו על ידי קבועי אגרוף אוטומטי בטווח -128 +127 היא שהם נשמרים במטמון על ידי ה-JVM. לכן, עטיפות כאלה עם אותם ערכים יהיו הפניות לאובייקט אחד.
-
-
למה משתמשים בו
autoboxing
?אצטט את ההרצאה:
כזכור, לג'אווה יש שני טיפוסים שעברו בירושה מהמחלקה
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
רָמָה
GO TO FULL VERSION