Çfarë është autoboxing dhe unboxing në Java?

Autoboxing & unboxing

Autoboxing & unboxing

Përmbledhje: Në këtë artikull ne do të diskutojnë në lidhje me autoboxing / tipar unboxing e java. Autoboxing dhe unboxing në thelb është një tipar për të kthyer në llojet primitive të dhënave të objekteve dhe të kundërt. I tërë procesi është bërë automatikisht nga java drejtuar mjedisi kohor. Por, duhet pasur kujdes gjatë zbatimit të këtë funksion përndryshe ajo do të ketë ndikim në ecurinë e aplikimit.

Parathënie
Para JDK 1.5, nuk ishte e lehtë për të kthyer në llojet primitive të dhënave e.g int, shkrumb, float, dyfishtë në objekt ekuivalentin e tyre - Integer, karakter, nxjerr në shitje, dyshe. JDK 5 erdhi me funksion të konvertimit automatik të llojeve të të dhënave primitive në objekt ekuivalentin e tyre. Ky funksion është i njohur si autoboxing. E kundërta e kësaj është e njohur si unboxing. i.e. procesi i konvertimin e objekteve në përkatëse llojet primitive të dhënave quhet unboxing. Kodi mostër për të dy autoboxing dhe Unboxing është treguar si në -

Autoboxing

[kod]

integer Integer = 9;

[/kod]

unboxing

[kod]

int në = 0;

në = Integer ri(9);

[/kod]

Kur Autoboxing dhe unboxing përdoret?

Autoboxing aplikohet nga përpiluesit java në kushtet e mëposhtme -

  • Kur një vlerë primitive është kaluar si një parametër për një metodë e cila pret një objekt të klasës përkatëse këmishë.
  • Kur një vlerë primitive është caktuar për një variabël të klasës përkatëse këmishë.

Konsideroni shembullin e mëposhtëm -

Listing1: Kodi mostër treguar Autoboxing

[kod]

sumEvenNumbers publike int(Listë<numër i plotë> intList ) { int sum = 0; për (integer i: intList ) nëse ( unë % 2 == 0 ) shuma = i; return sum;}

[/kod]

Para JDK 1.5, kodin copëza më sipër do të kishte rezultuar në humbje të hartimit që operatori tjetër - '%' dhe unary plus - ' =' nuk mund të aplikohet në numra të plotë. Por që JDK 1.5 kjo pjesë e kodit harton dhe shkon pa asnjë gabim si ajo konverton një numër të plotë për të int në kohën e duhur.

Unboxing aplikohet nga përpiluesit java në kushtet e mëposhtme -

  • Kur një objekt është kaluar si një parametër për një metodë e cila pret vlerën përkatëse primitive.
  • Kur një objekt është caktuar për një variabël të tipit përkatës primitive
  • Konsideroni shembullin e mëposhtëm -

Listing2: Kodi mostër treguar unboxing

[kod]

import java.util.ArrayList;import java.util.List; public class UnboxingCheck { publike statike kryesore void(Varg[] args) { Integer në = Integer ri(-8); // 1. Unboxing through method invocation int absVal = absoluteValue( in ); Println( “Vlera absolute e ” + in + ” = ” + absVal ); Listë<dyshe> doubleList = ArrayList ri<dyshe>(); // It is autoboxed through method invocation. doubleList.add(3.1416); // 2. Unboxing through assignment double phi = doubleList.get(0); Println( “phi = ” + phi ); } public static int absoluteValue( int i ) { return (unë < 0) ? -unë : unë; }}

[/kod]

Autoboxing dhe unboxing lejon zhvilluesi për të shkruar kodin që është e lehtë për të lexuar dhe për të kuptuar. Tabela e mëposhtme tregon të tipit të të dhënave primitive dhe objektet e tyre përkatëse mbështjellëse -

primitive Lloji këmishë Class
boolean Boolean
bajt bajt
shkrumb karakter
float nxjerr në shitje
int numër i plotë
gjatë gjatë
i shkurtër I shkurtër

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

Autoboxing dhe unboxing mund të bëhet me operatorët krahasim. Kodi copë në vijim ilustron se si kjo mund të bëhet -

Listing3: Kodi mostër treguar Autoboxing dhe Unboxing duke përdorur operatorët krahasim

[kod]

publik klasë BoxedComparator {

publike statike kryesore void(Varg[] args) {

Integer në = Integer ri(25);

nëse (in < 35)

Println(“Vlera e int = ” + in);

}

}

[/kod]
Autoboxing dhe unboxing me metodën mbingarkesën

Autoboxing ose unboxing është bërë në rastin e metodës mbingarkesën. Kjo ndodh në bazë të rregullave të mëposhtme -

  • rreh zgjerimi boks - Kur ka një situatë të zgjedhë mes zgjerimin dhe boks, zgjerimi merr përparësi -

Listing4: Kodi mostër treguar mbingarkesat preferencë

[kod]

publik klasë WideBoxed { publik klasë WideBoxed { static void methodWide(int i) { Println(“int”); } static void methodWide( integer i ) { Println(“numër i plotë”); } publike statike kryesore void(Varg[] args) { short shVal = 25; methodWide(shVal); } }}

[/kod]

Prodhimi i këtij programi është - int

  • Zgjerimi rreh Varargs - Kur ka një situatë të zgjedhë mes zgjerimin dhe varargs, zgjerimi merr përparësi -

Listing5: Kodi mostër treguar mbingarkesat preferencë

[kod]

WideVarArgs klasës publik {

methodWideVar statike void(int i1, int i2) {

Println(“int int”);

}

methodWideVar statike void(numër i plotë… unë) {

Println(“integers”);

} publike statike kryesore void( Varg[] args) {

short shVal1 = 25;

short shVal2 = 35;

methodWideVar( shVal1, shVal2);

}

}

[/kod]

  • Boxing rreh Varargs - Kur ka një situatë të zgjedhë mes boks dhe varargs, boks merr përparësi -

Listing6: Kodi mostër treguar mbingarkesat preferencë

[kod]

BoxVarargs klasës publik {

methodBoxVar statike void(integer në) {

Println(“numër i plotë”);

}

methodBoxVar statike void(numër i plotë… unë) {

Println(“integers”);

}

publike statike kryesore void(Varg[] args) {

int intVal1 = 25;

methodBoxVar(intVal1);

}

}

[/kod]

Gjërat për të kujtuar në mënyrë që të përdorin Autoboxing -

Siç e dimë se çdo tipar i mirë vjen me disa të meta, Autoboxing nuk është një përjashtim në këtë drejtim. Disa plumba të rëndësishme që një zhvillues duhet të mbani në mend ndërsa duke përdorur këtë funksion janë si në -

  • Krahasimi objekte me operatorin e barazisë - operatori i barazisë - '==' çon në konfuzion si ajo mund të aplikohet për të dy llojet primitive të dhënave dhe të objektit. Kur operatori është aplikuar në objekte, ai në fakt krahason referencën e objekteve dhe jo vlerat.

Listing7: Kodi mostër treguar krahasim

[kod]

publik klasë krahasuese {

publike statike kryesore void(Varg[] args) {

Instinct Integer = Integer ri(1);

Integer secondInt = Integer ri(1);

nëse (== SecondInt instinkt) {

Println(“si një janë të barabartë”);

} tjetër {

Println(“Të dy nuk janë të barabartë”);

}

}

}

[/kod]

  • Përzierja objekt dhe primitive në barazi dhe operatori relacionale - Nëse krahasojmë një lloj të të dhënave primitiv me një objekt, atëherë unboxing ndodh që mund të hedhin një NullPointerException në qoftë se objekti është i pavlefshëm.
  • Cached Object - Që nga valueOf()metodë është përdorur për të krijuar objekte boxed primitive, objektet e përdorura janë kopje. Që nga java arka integers nga -128 to 128, këto objekte kopje e ruajtur mund të sillen ndryshe.
  • degradimi Performance - Autoboxing ose unboxing degradon performancën e një kërkesë si ajo krijon një objekt të padëshiruar i cili udhëheq GC për të kandiduar më shpesh.

Disavantazhi i Autoboxing

Edhe pse autoboxing ka disa avantazhe, ajo ka disavantazhin e mëposhtme -

  • Nëse autoboxing ndodh brenda lak objekte të panevojshme merr krijuara dhe mund të ngadalësojnë punën e aplikimit. Konsideroni kodin e mëposhtëm -

Listing8: Kodi mostër tregon çështje të performancës

[kod]

sumEvenNumbers publike int(Listë<numër i plotë> intList) { int sum = 0; për (integer i: intList) nëse ( unë % 2 == 0 ) shuma = i; return sum;}

[/kod]

Në këtë pjesë të kodit, [kod] shuma = i; [/kod] do të zgjerohet si [kod] sum = shuma + unë; [/kod]. Që nga operacioni ' ' nuk mund të bëhet në objektin Integer, JVM shkakton unboxing e shumës Integer Objektit dhe atëherë rezultati është autoboxed mbrapa.

  • Para JDK 1.5, lloje të të dhënave int dhe Integer ishin të dallueshme dhe në rast të metodës mbingarkesat këto dy lloje janë përdorur pa ndonjë sherr. Tani me autoboxing dhe unboxing, kjo është bërë e komplikuar. Një shembull i kësaj është metoda e mbingarkuar hequr në ArrayList. Klasa ArrayList ka dy metoda për të hequr - hequr (indeks) dhe për të hequr (Objekt). In this case, Metoda mbingarkesa nuk do të ndodhë dhe metoda përkatëse do të quhet me parametrat e duhura.

Përfundim

Autoboxing është mekanizmi të fshehta një lloj primitiv të dhënave në këmishë përkatëse ose Object. Compiler përdor valueOf() metodë për të kthyer primitive për të Object dhe të përdor intValue(), doubleValue() etj për të marrë vlerën primitive nga Object. në autoboxing, një boolean është konvertuar në Boolean, byte të Byte, char të karakterit, float changes to Float, int shkon në Integer, kohë shkon të konvertuarve gjatë dhe të shkurtër të shkurtër, ndërsa në unboxing konvertimin ndodh në drejtimin e kundërt.

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

Enjoy this blog? Please spread the word :)

Follow by Email
LinkedIn
LinkedIn
Share