Въведение в 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? как работи вътрешно с някои примерни кодове? Можете да разгледате и другите ни предложени статии, за да научите повече -
- Какво е JDBC?
- Какво е Generics в Java?
- Groovy срещу Java
- Какво е наследяване на Java?
- Примери и как генериците работят в C #
- JRE срещу JVM | Топ 8 разлики с (Инфографика)