-
เกิดอะไรขึ้น
autoboxing
?Autoboxingเป็นกลไกในการเริ่มต้นอ็อบเจ็กต์ของคลาส wrapper โดยปริยาย (ไบต์, สั้น, อักขระ, จำนวนเต็ม, ยาว, ลอย, สองเท่า) ด้วยค่าของประเภทดั้งเดิมดั้งเดิมที่สอดคล้องกัน (ตามลำดับ , , , , , , ,
byte
,short
)char
โดยint
ไม่มีการใช้ตัวสร้างคลาสlong
อย่างชัดเจนfloat
double
การทำกล่องอัตโนมัติจะเกิดขึ้นเมื่อมีการกำหนดดั้งเดิมให้กับคลาส wrapper โดยตรง (โดยใช้
=
ตัวดำเนินการ " ") หรือเมื่อมีการส่งผ่านแบบดั้งเดิมไปยังพารามิเตอร์ของเมธอด (เช่น "คลาส wrapper") ทั้งตัวแปรประเภทดั้งเดิมและค่าคงที่เวลาคอมไพล์ (ตัวอักษรและfinal
-พื้นฐาน) สามารถบรรจุอัตโนมัติลงใน "คลาส wrapper" ได้ ในกรณีนี้ ตัวอักษรจะต้องถูกต้องทางวากยสัมพันธ์เพื่อเริ่มต้นตัวแปรที่เป็นประเภทดั้งเดิมดั้งเดิมการทำออโตบ็อกซ์ของตัวแปรประเภทดั้งเดิมนั้นจะต้องตรงกันทุกประการกับประเภทของประเภทดั้งเดิมดั้งเดิม - ประเภทของ "คลาส wrapper" ตัวอย่างเช่น การพยายามใส่ตัวแปรประเภท
byte
ลงใน กล่องอัตโนมัติShort
โดยไม่ทำการแคสต์อย่างชัดเจนก่อนbyte->short
จะทำให้เกิดข้อผิดพลาดในการคอมไพล์การออโต้บ็อกซ์ของค่าคงที่ประเภทดั้งเดิมช่วยให้ขอบเขตการจับคู่กว้างขึ้น ในกรณีนี้ คอมไพลเลอร์สามารถดำเนินการขยาย/ลดขนาดประเภทพื้นฐานโดยนัยล่วงหน้าได้ การเปลี่ยนแปลงเกิดขึ้นในสองขั้นตอน:
-
การขยายโดยนัย (การทำให้แคบลง) ของประเภทดั้งเดิมดั้งเดิมไปเป็นประเภทดั้งเดิมที่สอดคล้องกับคลาส wrapper (สำหรับการแปลง
int->Byte
ก่อนอื่นคอมไพเลอร์จะแคบลงโดยปริยายint
เป็นbyte
) -
การบรรจุอัตโนมัติของดั้งเดิมลงใน "คลาส wrapper" ที่เหมาะสม (คอมไพเลอร์ autopacks
byte->Byte
) อย่างไรก็ตาม ในกรณีนี้ มีข้อจำกัดเพิ่มเติมสองประการ: -
การกำหนดดั้งเดิมให้กับ "wrapper" สามารถทำได้โดยใช้
=
ตัวดำเนินการ " " เท่านั้น (คุณไม่สามารถส่งผ่านพารามิเตอร์ดั้งเดิมไปยังพารามิเตอร์เมธอดได้หากไม่มีการคัดเลือกประเภทที่ชัดเจน) -
ประเภทของตัวถูกดำเนินการทางด้านซ้ายจะต้องไม่เก่ากว่า
Character
ประเภทของตัวถูกดำเนินการทางขวาจะต้องไม่เก่ากว่า,int
(อนุญาตให้ขยาย/การหดตัวได้byte <-> short
, และเฉพาะการแคบลง, , , ตัวเลือกอื่น ๆ ทั้งหมดจำเป็นต้องมีการคัดเลือกประเภทที่ชัดเจน)byte <-> char
short <-> char
byte <- int
short <- int
char <- int
คุณสมบัติเพิ่มเติมของ "คลาส wrapper" จำนวนเต็มที่สร้างขึ้นโดยค่าคงที่ autoboxing ในช่วง -128 +127 คือ JVM แคชไว้ ดังนั้น wrappers ดังกล่าวที่มีค่าเดียวกันจะอ้างอิงถึงวัตถุเดียว
-
-
ทำไมมันถึงใช้
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
ระดับ
GO TO FULL VERSION