Wat is autoboxing en unboxing in Java?

Autoboxing & unboxing

Autoboxing & unboxing

Oorsig: In hierdie artikel sal ons gesels oor die autoboxing / unboxing kenmerk van Java. Autoboxing en unboxing is basies 'n funksie om primitiewe datatipes te skakel na voorwerpe en omgekeerde. Die hele proses is outomaties gedoen deur java hardloop tyd omgewing. Maar sorg moet geneem word terwyl die uitvoering van hierdie funksie anders sal dit invloed op aansoek prestasie het.

Inleiding
Voor JDK 1.5, Dit was nie maklik om primitiewe datatipes omskep Bv int, char, float, verdubbel in hul doel ekwivalent - Integer, Karakter, float, Dubbel. JDK 5 kom met die funksie van outomatiese omskakeling van primitiewe datatipes in hul doel ekwivalent. Hierdie funksie staan ​​bekend as autoboxing. Die teenoorgestelde hiervan staan ​​bekend as unboxing. d.w.z. die proses van die omskakeling van voorwerpe in ooreenstemmende primitiewe datatipes word unboxing genoem. Monster-kode vir beide autoboxing en unboxing word getoon as onder -

Autoboxing

[kode]

Integer heelgetal = 9;

[/kode]

unboxing

[kode]

int in = 0;

in = nuwe Integer(9);

[/kode]

Wanneer Autoboxing en unboxing gebruik?

Autoboxing toegepas deur die Java samesteller in die volgende voorwaardes -

  • Wanneer 'n primitiewe waarde is verby as 'n parameter na 'n metode wat 'n voorwerp van die ooreenstemmende wrapper klas verwag.
  • Wanneer 'n primitiewe waarde aan 'n veranderlike van die ooreenstemmende wrapper klas.

Kyk na die volgende voorbeeld -

Listing1: Monster-kode wat Autoboxing

[kode]

openbare int sumEvenNumbers(lys<Heelgetal> intList ) { int sum = 0; vir (integer i: intList ) indien ( i % 2 == 0 ) som = i; return sum;}

[/kode]

Voor JDK 1.5, bogenoemde kode uit tot gevolg sou gehad samestelling fout sedert die res operateur - '% en die unêre plus -' = 'kan nie toegepas word op Heelgetalle. Maar sedert JDK 1.5 hierdie stuk kode stel en loop sonder enige fout as dit 'n heelgetal te int tydens looptyd vat.

Unboxing is deur die Java samesteller toegepas in die volgende voorwaardes -

  • Wanneer 'n voorwerp oorgedra word as 'n parameter na 'n metode wat die ooreenstemmende primitiewe waarde verwag.
  • Wanneer 'n voorwerp aan 'n veranderlike van die ooreenstemmende primitiewe tipe
  • Kyk na die volgende voorbeeld -

Listing2: Monster-kode wat unboxing

[kode]

invoer java.util.ArrayList;invoer java.util.List; public class UnboxingCheck { openbare statiese nietig hoof(String[] argumente) { Integer in = nuwe heelgetal(-8); // 1. Unboxing through method invocation int absVal = absoluteValue( in ); System.out.println( “absolute waarde van ” + in + ” = ” + absVal ); lys<Dubbel> doubleList = nuwe Array List<Dubbel>(); // It is autoboxed through method invocation. doubleList.add(3.1416); // 2. Unboxing through assignment double phi = doubleList.get(0); System.out.println( “Phi = ” + phi ); } public static int absoluteValue( int i ) { return (i < 0) ? -i : i; }}

[/kode]

Autoboxing en unboxing kan die ontwikkelaar om kode te skryf wat maklik is om te lees en te verstaan. Die volgende tabel toon die primitiewe gegee tik en hul ooreenstemmende wrapper voorwerpe -

primitiewe Tipe wrapper Klas
boolean Boole
byte byte
char Karakter
float float
int Heelgetal
lank Lank
kort kort

Table - 1: Primitive data type and their equivalent wrapper classes With Comparison operators

Autoboxing en unboxing kan gedoen word met vergelyking operateurs. Die volgende kode uit illustreer hoe dit gedoen kan word -

Listing3: Monster-kode wat Autoboxing en unboxing behulp vergelyking operateurs

[kode]

openbare klas BoxedComparator {

openbare statiese nietig hoof(String[] argumente) {

Integer in = nuwe heelgetal(25);

indien (in < 35)

System.out.println(“Waarde van int = ” + in);

}

}

[/kode]
Autoboxing en unboxing met metode oorlading

Autoboxing of unboxing word in geval van metode oorlading. Dit gebeur op grond van die volgende reëls -

  • Verbreding slae boks - Wanneer daar 'n situasie te kies tussen verbreding en boks, verbreding neem die voorkeur -

Listing4: Monster-kode wat oorlaai voorkeur

[kode]

openbare klas WideBoxed { openbare klas WideBoxed { static void methodWide(int i) { System.out.println(“int”); } static void methodWide( integer i ) { System.out.println(“Heelgetal”); } openbare statiese nietig hoof(String[] argumente) { short shVal = 25; methodWide(shVal); } }}

[/kode]

Die opbrengs van hierdie program is - int

  • Verbreding klop Varargs - Wanneer daar 'n situasie te kies tussen verbreding en varargs, verbreding neem die voorkeur -

Listing5: Monster-kode wat oorlaai voorkeur

[kode]

openbare klas WideVarArgs {

statiese nietig methodWideVar(int i1, int I2) {

System.out.println(“int int”);

}

statiese nietig methodWideVar(Heelgetal… i) {

System.out.println(“heelgetalle”);

} openbare statiese nietig hoof( String[] argumente) {

kort shVal1 = 25;

kort shVal2 = 35;

methodWideVar( shVal1, shVal2);

}

}

[/kode]

  • Boks klop Varargs - Wanneer daar 'n situasie te kies tussen boks en varargs, Boks neem die voorkeur -

Listing6: Monster-kode wat oorlaai voorkeur

[kode]

openbare klas BoxVarargs {

statiese nietig methodBoxVar(integer in) {

System.out.println(“Heelgetal”);

}

statiese nietig methodBoxVar(Heelgetal… i) {

System.out.println(“heelgetalle”);

}

openbare statiese nietig hoof(String[] argumente) {

int intVal1 = 25;

methodBoxVar(intVal1);

}

}

[/kode]

ten einde Autoboxing gebruik dinge om te onthou -

Soos ons weet dat elke goeie eienskap kom met 'n paar nadele, Autoboxing is nie 'n uitsondering in hierdie verband. Sommige belangrike koeëls wat 'n ontwikkelaar in gedagte moet hou, terwyl die gebruik van hierdie funksie is as onder -

  • Vergelyk voorwerpe met gelykheid operateur - Die operateur gelykheid - '==' lei tot verwarring as dit toegepas kan word om beide primitiewe datatipes en die voorwerp. Wanneer die operateur toegepas op voorwerpe, dit eintlik vergelyk die verwysing van die voorwerpe en nie die waardes.

Listing7: Monster-kode wat vergelyking

[kode]

openbare klas Comparator {

openbare statiese nietig hoof(String[] argumente) {

Instink Integer = nuwe Integer(1);

Integer secondInt = nuwe heelgetal(1);

indien (== Instink secondInt) {

System.out.println(“albei een gelyk”);

} else {

System.out.println(“Beide een is nie gelyk”);

}

}

}

[/kode]

  • Meng voorwerp en primitief in gelykheid en relasionele operateur - As ons vergelyk 'n primitiewe soort data met 'n voorwerp, dan is die unboxing plaasvind wat 'n NullPointerException kan gooi as die voorwerp is van nul.
  • Cached Object - Sedert die WAARDE()metode word gebruik om doos primitiewe voorwerpe te skep, die gebruik voorwerpe kas. Sedert Java caches heelgetalle vanaf -128 to 128, hierdie kas voorwerpe kan anders optree.
  • Prestasie agteruitgang - Autoboxing of unboxing afbreek van die prestasie van 'n aansoek soos dit 'n ongewenste voorwerp wat die GC lei tot meer gereeld loop skep.

Nadeel van Autoboxing

Hoewel autoboxing het verskeie voordele, Dit het die volgende nadeel -

  • As autoboxing gebeur binne 'n lus onnodige voorwerpe kry geskep en dit kan vertraag die prestasie van die aansoek. Oorweeg die volgende kode -

Listing8: Monster-kode wat prestasie kwessie

[kode]

openbare int sumEvenNumbers(lys<Heelgetal> intList) { int sum = 0; vir (integer i: intList) indien ( i % 2 == 0 ) som = i; return sum;}

[/kode]

In hierdie stuk kode, [kode] som = i; [/kode] sal as uit te brei [kode] som = som + i; [/kode]. Sedert die ' ' operasie nie gedoen kan word op Integer voorwerp, die JVM snellers die unboxing van som Integer Object en dan die resultaat is terug autoboxed.

  • Voor JDK 1.5, datatipes int en Integer was duidelike en in die geval van metode oorlaai hierdie twee tipes is gebruik sonder enige moeite. Nou met autoboxing en unboxing, Dit het moeiliker geword. 'N Voorbeeld hiervan is die oorlaai verwyder metode in Array List. Klas Array List het twee verwyder metodes - verwyder (indeks) en verwyder (voorwerp). In this case, metode oorlading sal nie gebeur nie en die onderskeie metode sal belê word deur toepaslike parameters.

Gevolgtrekking

Autoboxing is die meganisme om 'n primitiewe soort data in onderskeie wrapper of voorwerp koverte. Samesteller gebruik WAARDE() metode om te sit primitief om beswaar en gebruik intValue(), doubleValue() ens te primitief waarde van voorwerp. in autoboxing, 'n Boole omgeskakel word na Boole, byte te Byte, char om Character, float changes to Float, int gaan Integer, lank gaan na lang en kort bekeerlinge tot Kort, terwyl dit in unboxing die omskakeling gebeur in die teenoorgestelde rigting.

Tagged on: , ,
============================================= ============================================== Buy best TechAlpine Books on Amazon
============================================== ---------------------------------------------------------------- electrician ct chestnutelectric
error

Enjoy this blog? Please spread the word :)

Follow by Email
LinkedIn
LinkedIn
Share