Úvod do Autoboxingu a odblokovania v Jave
Autoboxing je automatická konverzia, ktorú kompilátor Java vykonáva medzi primitívnymi typmi a ich zodpovedajúcimi triedami obalových objektov, tj konverzia z int na celé číslo, dvojitá na Double atď. Unboxing je automatická konverzia z objektov triedy wrapper na ich ekvivalentné primitívy, tj celé číslo na int atď. Táto funkcia bola zavedená vo verzii java, autoboxing a unboxing 1.5, ako sú automatické procesy spracovávané JRE, najdôležitejším bodom je tu napísanie správneho kódu, ktorý nepridáva na obrázok príliš zbytočné objekty.
Teraz sa porozprávajte o internom fungovaní Autoboxingu a Unboxingu v Jave -
- Kompilátor používa metódu valueOf () na konverziu primitívov na zodpovedajúce objekty typu wrapper (tj autoboxing) interne, v opačnom prípade používa vzory na rozbalenie typu intValue (), doubleValue () atď.
- Pre porovnanie uvádzame mapovanie obalov a primitívov v jave -
Primitívny typ | Trieda balenia |
boolean | boolean |
byte | byte |
spáliť | znak |
plavák | Plavák |
int | celé číslo |
dlho | dlho |
krátky | Krátky |
dvojitý | dvojitý |
Príklady -
- Zoberme si teraz zoznam polí celých čísel a potom využijeme koncept rozbalenia -
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);
)
)
- Preto v príklade uvedenom vyššie, keď pridávame hodnotu do x, vidíme, že x sa javí ako primitívny, takže vyprchávanie tu nastane automaticky, keď sa toto priradenie uskutoční.
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);
)
)
- Práve vyššie sme v tomto kontexte ukázali príklad -2, kde bol uvedený typický scenár. Ak ste oboznámení s tvorbou objektov v jave, môžete vidieť, že „Integer sum = 0“, deklaruje objekt, a keď počítame vo vnútri slučky for, potom vidíme, že primitívna hodnota „i“ sa pridáva do wrappera “ sum ".
- Preto je možné zistiť, že najskôr dôjde k prevodu z wrapperu na primitívny, pretože operátor „+“ pracuje iba na primitívnych prvkoch, a preto najskôr dôjde k odblokovaniu objektov, potom dôjde k výpočtu, potom opäť k autoboxovaniu objektov a potom k hodnote bude priradená premennej „suma“.
- To predstavuje zbytočnú réžiu na JVM, pretože sa vytvorí mnoho stredných celočíselných objektov, ktoré sa zničia (aby sa neskôr zozbierali odpadky), takže sa môže objaviť spomalenie, takže s takou logikou sa musí zaobchádzať opatrne.
- Pozrime sa teraz na podmienky odlišné od všeobecného vnímania a budeme mať nejaký kód, v ktorom bude veľmi dôležité porozumieť autoboxovaniu a rozbaľovaniu -
Zoberme si úryvok umiestnený nižšie, čo podľa vás bude výsledkom?
public class Main
(
public static void main(String() args) (
Integer m = 34123;
Integer x = 34123;
System.out.println(x==m);
)
)
- Ak hovoríte „true“, potom ste „false“, pretože výstup je tiež „false“, je to preto, že môžeme porovnávať iba celé číslo od -128 do 127, ako je táto, pre hodnoty, ktoré idú z tohto rozsahu, majú byť unboxed.
- Preto musíme porovnávať intValue () vyššie uvedených celých čísel, zatiaľ to kompilátor robí pomocou vlastnosti valueOf ().
- Pravdepodobne, ak to spadá do vyššie uvedeného rozsahu, potom vyššie uvedený kód, ako je, bude pravdivý, pretože sa najprv bude porovnávať s celočíselným literálnym fondom.
public class Main
(
public static void main(String() args) (
Integer m = 100;
Integer x = 100;
System.out.println(x==m);
)
)
Toto sa vyhodnotí na „skutočnú“ hodnotu, keďže 100 je v literálnom fonde.
Autoboxing a Unboxing v Jave s preťažením metódou
- Predtým, ako označíme autoboxing a unboxing na preťaženie metód, predpokladá sa, že čitateľ je oboznámený s konceptom preťaženia metód, len poskytneme malé informácie a pre viac informácií si pozrite dokumentáciu Oracle.
- Preťaženie metódy je proces, pri ktorom sa používa rovnaký názov metódy s rôznym počtom vstupných argumentov, rôznych typov údajov premenných s rovnakými názvami atď., Ktoré sa všeobecne používajú na predloženie viacerých variantov akejkoľvek metódy výpočtu.
- Vezmime príklad, aby sme tomu porozumeli hlbšie a predstavíme výstup, ktorý sa tentoraz objaví na obrázku -
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);
)
)
Výkon -
tlač nezatlačenej hodnoty 5
tlač autoboxovanej hodnoty 5
Poznámka - vyššie uvedený program môžete spustiť v ktoromkoľvek z IDE, aby ste dostali vyššie umiestnený výstup.
- Preto vyššie uvedené správanie jasne hovorí, že technika autoboxovania má významné využitie v koncepciách preťaženia a pri kódovaní sa musí používať opatrne.
Výhody autoboxovania a odblokovania v Java-
- Príslušnú konverziu vykoná automaticky kompilátor.
- Vývojár by mal písať menší kód, a tým čistší kód.
- Nevyžadujú sa manuálne výrazy typu casting.
záver
Videli sme prípad použitia autoboxingu a rozbalenia, aký implicitný je tento koncept a kde môže vytvárať klady a zápory. Pri kódovaní sa musí používať opatrne, inak môže pridať nadbytočné výpočtové režijné náklady, preto sa musia konverzie vykonať v primitívach, aby sa predišlo nadmernému režijnému zberu odpadu a nadmernému vytváraniu dočasných objektov. Videli sme aj prípad použitia autoboxingu s konceptom preťaženia java, môžete skontrolovať niekoľko ďalších obmedzení.
Odporúčané články
Toto bol sprievodca pre Autoboxing a Unboxing v Jave. Tu sa tiež venujeme téme Čo je to Autoboxing a Unboxing v jave? ako to funguje interne s niektorými ukážkovými kódmi? Viac informácií nájdete aj v ďalších navrhovaných článkoch -
- Čo je to JDBC?
- Čo je generika v jazyku Java?
- Groovy vs Java
- Čo je dedičstvo Java?
- Príklady a ako generiká fungujú v jazyku C #
- JRE vs JVM | 8 najlepších rozdielov s (infografika)