Въведение в Autoboxing и Unboxing в Java

Автобоксирането е автоматичното преобразуване, което Java компилаторът прави между примитивните типове и съответните им класове за обвиване на обекти, т.е. преобразуване от int в Integer, двойно в Double и т.н. Unboxing е автоматичното преобразуване от обекти на клас обвивка в техните еквивалентни примитиви, т.е. Integer to int и др. Тази функция е въведена във версия 1.5 на java, автобоксиране и дебоксиране, както са автоматичните процеси, обработвани от JRE, най-важният момент тук е да напишете правилен код, който не добавя излишни ненужни обекти в снимката.

Сега нека да обсъдим как Autoboxing и Unboxing в Java върви вътрешно -

  • Компилаторът използва метода valueOf (), за да преобразува примитиви в съответните обекти за обвиване (т.е. автобоксиране) вътре, в обратния случай използва intValue (), doubleValue () и т.н. като парадигми за дебоксиране.
  • За справка, картографирането на опаковката и примитивите в Java е споменато по-долу -
Примитивен типКлас за опаковане
булеваБулева
байтбайт
овъглявамхарактер
поплавъкпоплавък
интцяло число
дългодълго
късКъс
двойнодвойно

Примери -

  • Нека сега вземем ArrayList of Integers и след това използваме концепцията за unboxing -

import java.util.ArrayList;
public class MyClass (
public static void main(String args()) (
ArrayList intlist = new ArrayList();
//wrapper Integer objects being added here
intlist.add(1);
interest.add(2);
//auto-unboxing is happening here
int x = intlist.get(0);
System.out.println(x);
)
)

  • Следователно, в горния пример, докато добавяме стойност към x, виждаме, че x изглежда примитивен, така че тук отварянето се случва автоматично, докато това задаване се извършва.

public class MyClass (
public static void main(String args()) (
Integer sum =0;
for(int i=0;i<10;i++)
(
sum = sum + i;
)
System.out.println(sum);
)
)

  • Малко по-горе показахме пример -2 в този контекст, където е представен типичен сценарий. Ако сте запознати със създаването на обекти в java, можете да видите, че „Integer sum = 0“, декларира обект и когато правим изчисления вътре в цикъл for, тогава можем да видим, че примитивната стойност „i“ се добавя към опаковката “ сума ".
  • Оттук може да се установи, че първо ще се извърши преобразуване от обвивка в примитивна, тъй като операторът "+" работи само върху примитиви, и следователно първо ще се разблокира обекта, след това ще се извърши изчислението, след това отново ще се извърши автобоксирането на обекти и след това стойността ще бъде присвоена на променливата „сума“.
  • Това представя ненужни режийни разходи върху JVM, тъй като много междинни цели цели ще бъдат създадени и ще бъдат унищожени (за да бъдат събрани по-късно боклук), като по този начин може да се появи забавяне, така че с такива логики трябва да се работи внимателно.
  • Нека да видим сега условия, различни от общите схващания и ще имаме някакъв код, при който автобоксирането и дебоксирането стават много важни, за да бъдат разбрани -

Помислете фрагмента, поставен по-долу, какво мислите ще бъде резултатът от това?

public class Main
(
public static void main(String() args) (
Integer m = 34123;
Integer x = 34123;
System.out.println(x==m);
)
)

  • Ако казвате "вярно", тогава сте "невярно", защото изходът е също "невярно", това е, защото можем да сравним само целочисления диапазон от -128 до 127 като този, за стойности, излизащи от този диапазон, те трябва да бъдат Без Опаковка.
  • Следователно трябва да сравним intValue () на горните Integers, засега компилаторът прави това, използвайки свойството valueOf ().
  • Вероятно, ако това попадне в цитирания по-горе диапазон, горният код, както е, ще даде истина, тъй като първо ще се отнесе към целочисления буквален пул за сравнение.

public class Main
(
public static void main(String() args) (
Integer m = 100;
Integer x = 100;
System.out.println(x==m);
)
)

Това ще оцени до "вярна" стойност, тъй като 100 присъстват в буквалния пул.

Autoboxing и Unboxing в Java с метод на претоварване

  • Преди да маркираме автобоксирането и дебоксирането на претоварване с методи, се предполага, че читателят е запознат с концепцията за претоварване на метода, просто ще дадем малко прозрения и за повече, моля, вижте документацията на Oracle за същото.
  • Претоварването на метод е процес, при който едно и също име на метод се използва с различен брой входни аргументи, различни типове данни на променливи със същите имена и т.н., които се използват за представяне на множество варианти на всеки метод на изчисление като цяло.
  • Нека вземем пример за същото, за да го разберем по-дълбоко и също така ще представим изхода, който се появява на снимката този път -

public class Main
(
public static void main(String() args) (
Overload obj = new Overload();
int i =5;
obj.printval(5);
Integer m = i;
obj.printval(m);
)
)
class Overload
(
public void printval(int i)
(
System.out.println("printing the unboxed value "+ i);
)
public void printval(Integer i)
(
System.out.println("printing the autoboxed value "+ i);
)
)

Резултат -

отпечатване на необозначена стойност 5
отпечатване на автоматичната стойност 5

Забележка - можете да изпълните горната програма в която и да е от IDE, за да имате горепосочения изход.

  • Следователно по-горе поведението ясно показва, че техниката на автобоксинг има значително използване при концепциите за претоварване и тя трябва да се използва внимателно при кодирането.

Предимства на Autoboxing и Unboxing в Java-

  • Подходящото преобразуване се извършва автоматично от компилатора.
  • Предполага се, че разработчикът ще напише по-малък код и по този начин по-чист код.
  • Няма нужда от ръчно изрази за леене на тип.

заключение

Видяхме случай на използване на автобоксиране и дебоксиране, колко неявна е тази концепция и къде може да създаде плюсове и минуси. Трябва да се използва внимателно, докато кодира, в противен случай може да добави ненужни изчислителни конверсии, така че преобразуванията се извършват в примитивите, за да се избегне прекомерното събиране на боклук и наднорменото създаване на временни обекти. Видяхме и случай на използване на автобоксиране с концепцията за претоварване на java, можете да проверите още няколко ограничения заедно с това.

Препоръчителни статии

Това е ръководство за Автобоксиране и Дебоксиране в Java. Тук също обсъждаме Какво е Автобокс и Unboxing в Java? как работи вътрешно с някои примерни кодове? Можете да разгледате и другите ни предложени статии, за да научите повече -

  1. Какво е JDBC?
  2. Какво е Generics в Java?
  3. Groovy срещу Java
  4. Какво е наследяване на Java?
  5. Примери и как генериците работят в C #
  6. JRE срещу JVM | Топ 8 разлики с (Инфографика)