-
کیا ہوا
autoboxing
؟آٹو باکسنگ
byte
ریپر کلاسز (بائٹ، شارٹ، کریکٹر، انٹیجر، لانگ، فلوٹ، ڈبل) کی اشیاء کو ان کی متعلقہ اصل قدیم اقسام (بالترتیب، , , , , , , ,short
) کے بغیر واضح طور پر شروع کرنے کا ایک طریقہ کار ہےchar
۔ کلاس کنسٹرکٹر کا واضح استعمال ۔int
long
float
double
آٹو باکسنگ اس وقت ہوتی ہے جب ایک پرائمیٹو کو براہ راست کسی ریپر کلاس کو تفویض کیا جاتا ہے ("
=
" آپریٹر کا استعمال کرتے ہوئے)، یا جب پرائمٹیو کو طریقہ کار کے پیرامیٹرز میں منتقل کیا جاتا ہے (جیسے "ریپر کلاس")۔ قدیم قسم کے متغیرات اور کمپائل ٹائم کنسٹنٹ (لفظی اورfinal
پرائمیٹوز) کو "ریپر کلاسز" میں آٹو پیک کیا جا سکتا ہے۔ اس صورت میں، اصل قدیم قسم کے متغیر کو شروع کرنے کے لیے لٹریلز کو نحوی طور پر درست ہونا چاہیے۔قدیم اقسام کے متغیرات کی آٹو باکسنگ کے لیے اصل پرائمیٹ کی قسم - "ریپر کلاس" کی قسم سے قطعی مماثلت کی ضرورت ہوتی ہے۔ مثال کے طور پر، پہلے واضح کاسٹ کیے بغیر،
byte
میں ایک قسم کے متغیر کو آٹو باکس کرنے کی کوشش، تالیف کی خرابی کا سبب بنے گی۔Short
byte->short
قدیم قسم کے مستقلوں کی آٹو باکسنگ وسیع مماثل حدود کی اجازت دیتی ہے۔ اس صورت میں، مرتب کرنے والا ابتدائی اقسام کی مضمر توسیع/تنگ کرنے کے قابل ہوتا ہے۔ تبدیلی دو مراحل میں ہوتی ہے:
-
ریپر کلاس سے مطابقت رکھنے والی قدیم قسم کی اصل قدیم قسم کی مضمر توسیع (تنگ) (تبدیلی کے لیے
int->Byte
، پہلے مرتب کرنے والا واضح طورint
پرbyte
) -
مناسب "ریپر کلاس" (مرتب کرنے والا autopacks
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