Úvod do Autoboxing a Unboxing v Javě
Autoboxing je automatická konverze, kterou kompilátor Java provádí mezi primitivními typy a jejich odpovídajícími třídami obalů objektů, tj. Převod z int na Integer, double na Double atd. Unboxing je automatický převod z objektů třídy wrapper na jejich ekvivalentní primitivy, tj. Integer na int atd. Tato funkce byla představena ve verzi 1.5 java, autoboxing a unboxing, jako jsou automatické procesy zpracovávané JRE, nejdůležitějším bodem zde je psaní správného kódu, který nepřidává zbytečné zbytečné objekty do obrázku.
Nyní pojďme diskutovat o tom, jak Autoboxing a Unboxing v Javě interně funguje -
- Kompilátor používá metodu valueOf () k převedení primitiv na odpovídající objekty wrapperu (tj. Autoboxing) interně, naopak používá pro rozbalení podobná pravidla jako intValue (), doubleValue () atd.
- Pro orientaci níže uvádíme mapování obalů a primitivů v javě -
Primitivní typ | Třída obalů |
boolean | Boolean |
byte | Byte |
char | Charakter |
plovák | Plovák |
int | Celé číslo |
dlouho | Dlouho |
krátký | Krátký |
dvojnásobek | Dvojnásobek |
Příklady -
- Vezměme si nyní ArrayList of Integers a pak využijte koncept rozbalení -
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);
)
)
- Proto ve výše uvedeném příkladu, když přidáváme hodnotu k x, vidíme, že x se zdá být primitivní, takže odkládání probíhá zde automaticky, když je přiřazení provedeno.
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);
)
)
- Těsně výše jsme v tomto kontextu ukázali příklad -2, kde byl představen typický scénář. Pokud jste se seznámili s vytvářením objektů v javě, můžete vidět, že „Integer sum = 0“, deklaruje objekt, a když počítáme uvnitř smyčky for, pak můžeme vidět, že primitivní hodnota „i“ je přidávána do wrapperu “ součet".
- Lze tedy zjistit, že nejprve dojde k převodu z wrapperu na primitiva, protože operátor „+“ pracuje pouze na primitivech, a proto nejprve dojde k odbalení objektu, poté dojde k výpočtu, poté dojde k opětovnému Autoboxing objektu a poté k hodnotě bude přiřazena proměnné „suma“.
- To představuje zbytečnou režii na JVM, protože bude vytvořeno mnoho mezilehlých objektů Integer a bude zničeno (aby bylo později shromážděno odpadky), takže se může objevit zpomalení, takže s takovou logikou je třeba zacházet opatrně.
- Podívejme se nyní na podmínky odlišné od obecného vnímání a budeme mít nějaký kód, kde bude velmi důležité pochopit autoboxing a unboxing -
Zvažte úryvek umístěný níže, co podle vás bude výsledkem?
public class Main
(
public static void main(String() args) (
Integer m = 34123;
Integer x = 34123;
System.out.println(x==m);
)
)
- Pokud říkáte „true“, pak jste „false“, protože výstup je také „false“, je to proto, že můžeme srovnávat pouze celé rozmezí od -128 do 127, jako je tato, pro hodnoty vycházející z tohoto rozsahu mají být bez obalu.
- Proto musíme porovnat intValue () výše uvedených celých čísel, zatím to kompilátor provede pomocí vlastnosti valueOf ().
- Pravděpodobně, pokud to spadá do výše uvedeného rozsahu, pak výše uvedený kód, jak je, bude pravdivý, protože se nejprve bude odkazovat na celočíselný literální fond pro srovnání.
public class Main
(
public static void main(String() args) (
Integer m = 100;
Integer x = 100;
System.out.println(x==m);
)
)
To se vyhodnotí jako „skutečná“ hodnota, protože 100 je v literálním fondu.
Autoboxing a Unboxing v Javě s přetížením metod
- Než označíme autoboxing a unboxing na přetížení metody, předpokládá se, že čtenář je obeznámen s konceptem přetížení metody, poskytneme jen malý náhled a další informace najdete v dokumentaci Oracle.
- Přetížení metody je proces, ve kterém se používá stejný název metody s různým počtem vstupních argumentů, různých datových typů proměnných se stejnými jmény atd., Které se obecně používají k prezentaci více variant jakékoli metody výpočtu.
- Vezměme si příklad, abychom tomu porozuměli hlouběji a představíme výstup, který se tentokrát objeví 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ýstup -
tisk hodnoty bez pole 5
tisk autoboxed hodnoty 5
Poznámka - výše uvedený program můžete spustit v kterémkoli z IDE, aby měl výše uvedený výstup.
- Proto výše uvedené chování jasně říká, že technika autoboxingu má významné využití v koncepcích přetížení a při kódování se musí používat opatrně.
Výhody Autoboxing a Unboxing v Javě-
- Příslušný převod provádí kompilátor automaticky.
- Vývojář má psát menší kód, a tím čistší kód.
- Není třeba manuálních výrazů pro odlévání typu.
Závěr
Viděli jsme případ použití autoboxingu a unboxingu, jak implicitně je tento koncept a kde může vytvářet klady a zápory. Při kódování se musí používat opatrně, jinak může přidat zbytečné výpočtové převody režie, proto se musí převody provádět v primitivech, aby se zabránilo nadměrné režii sběru odpadu a nadměrnému vytváření dočasných objektů. Také jsme viděli případ použití autoboxingu s konceptem přetížení javy, můžete s ním zkontrolovat několik dalších omezení.
Doporučené články
Toto byl průvodce aplikací Autoboxing a Unboxing v Javě. Tady také diskutujeme Co je to Autoboxing a Unboxing v javě? jak to funguje interně s některými ukázkovými kódy? Další informace naleznete také v dalších navrhovaných článcích -
- Co je to JDBC?
- Co je to Generics v Javě?
- Groovy vs Java
- Co je dědičnost Java?
- Příklady a jak generici pracují v C #
- JRE vs JVM | 8 hlavních rozdílů s (infografika)