Kio estas autoboxing kaj unboxing en Java?

Autoboxing & unboxing

Autoboxing & Unboxing

Superrigardo: En ĉi tiu artikolo ni diskutos pri la autoboxing / Unboxing ĉefaĵo de java. Autoboxing kaj unboxing estas resume ĉefaĵo transformi primitivajn datumajn tipojn al Objektoj kaj inversigo. La tuta procezo estas farita aŭtomate de java kura tempo medio. Sed prizorgo devus esti prenita dum efektiviganta ĉi tiun ĉefaĵon alie ĝi havos efikon sur aplika elfaro.

Enkonduko
Antaŭ JDK 1.5, Ĝi ne estis facile transformi primitivaj datumaj tipoj e.G int, Cindrigi, Flosigi, Duoblo en ilia objekto ekvivalenta – Integralo, Karaktero, Flosigi, Duoblo. JDK 5 Venis kun la ĉefaĵo de aŭtomata konvertiĝo de primitivaj datumaj tipoj en ilia objekta ekvivalento. Ĉi tiu ĉefaĵo estas konata kiel autoboxing. La inversigo de tio ĉi estas konata kiel unboxing. T.e. La procezo transformi objektojn en respondanta primitivajn datumajn tipojn estas vokita unboxing. Ekzempla kodo por ambaŭ autoboxing kaj unboxing estas montrita kiel nesufiĉe –

Autoboxing

[Kodo]

Integrala integralo = 9;

[/Kodo]

Unboxing

[Kodo]

Int je = 0;

En = nova Integralo(9);

[/Kodo]

Kiam Autoboxing kaj unboxing estas uzita?

Autoboxing estas aplikita de la java compiler en la sekvantaj kondiĉoj –

  • Kiam primitiva valoro estas pasita kiel parametro al metodo kiu atendas objekton de la responda envolvaĵa klaso.
  • Kiam primitiva valoro estas asignita al varia de la responda envolvaĵa klaso.

Konsideri la sekvantan ekzemplon –

Listing1: Ekzempla kodo montranta Autoboxing

[Kodo]

Publika int sumEvenNumbers(Listo<Integralo> IntList ) { Int sumo = 0; Por (Integralo i: IntList ) Se ( I % 2 == 0 ) Sumo = i; Revena sumo;}

[/Kodo]

Antaŭ jdk 1.5, La supra koda ereto estus rezultinta en kompila eraro ekde la cetera operacianto – ‘%' kaj la unary plus – ‘ =' ne povus esti aplikita sur Integraloj. Sed pro tio ke jdk 1.5 Ĉi tiu peco de kodo kompilas kaj kuroj sen ajna eraro kiel ĝi transformas Integralon al int ĉe runtime.

Unboxing estas aplikita de la java compiler en la sekvantaj kondiĉoj –

  • Kiam objekto estas pasita kiel parametro al metodo kiu atendas la respondan primitivan valoron.
  • Kiam objekto estas asignita al varia de la responda primitiva tipo
  • Konsideri la sekvantan ekzemplon –

Listing2: Ekzempla kodo montranta Unboxing

[Kodo]

Importi java.Util.ArrayList;Importi java.Util.Listo; Publika klaso UnboxingCheck { Publika senmova malplena ĉefa(Ŝnuro[] Args) { Integralo en = nova Integralo(-8); // 1. Unboxing tra metoda alvokado int absVal = absoluteValue( Je ); Sistemo.Ekstere.Println( “Absoluta valoro de ” + Je + ” = ” + AbsVal ); Listo<Duoblo> DoubleList = nova ArrayList<Duoblo>(); // Ĝi estas autoboxed tra metoda alvokado. DoubleList.Aldonas(3.1416); // 2. Unboxing tra komisia duoblo phi = doubleList.Akiras(0); Sistemo.Ekstere.Println( “Phi = ” + Phi ); } Publika senmova int absoluteValue( Int i ) { Reveno (I < 0) ? -I : I; }}

[/Kodo]

Autoboxing kaj unboxing permesas la ellaboranton skribi kodon kiu estas facile legi kaj kompreni. La sekvanta tablo montras la primitivan datatypes kaj iliaj respondaj envolvaĵaj objektoj –

Primitiva Tipo Envolvaĵa Klaso
Boolea Boolea
Byte Byte
Cindrigi Karaktero
Flosigi Flosigi
Int Integralo
Longe Longe
Mallonga Mallonga

Tablo – 1: Primitiva datuma tipo kaj iliaj ekvivalentaj envolvaĵaj klasoj Kun Komparaj operaciantoj

Autoboxing kaj unboxing povas esti farita kun komparaj operaciantoj. La sekvanta koda ereto ilustras kiel ĝin povas esti farita –

Listing3: Ekzempla kodo montranta Autoboxing kaj unboxing uzanta komparajn operaciantojn

[Kodo]

Publika klaso BoxedComparator {

Publika senmova malplena ĉefa(Ŝnuro[] Args) {

Integralo en = nova Integralo(25);

Se (Je < 35)

Sistemo.Ekstere.Println(“Valoro de int = ” + Je);

}

}

[/Kodo]
Autoboxing kaj unboxing kun metodo troŝarĝanta

Autoboxing aŭ unboxing estas farita en kazo de metodo troŝarĝanta. Tio ĉi okazas bazita sur la sekvantaj reguloj –

  • Larĝiganta taktojn boksanta – Kiam estas situacio elekti inter larĝiganta kaj bokso, Larĝiganta prenas la preferon –

Listing4: Ekzempla kodo montranta troŝarĝanta preferon

[Kodo]

Publika klaso WideBoxed { Publika klaso WideBoxed { Senmova malplena methodWide(Int i) { Sistemo.Ekstere.Println(“Int”); } Senmova malplena methodWide( Integralo i ) { Sistemo.Ekstere.Println(“Integralo”); } Publika senmova malplena ĉefa(Ŝnuro[] Args) { Mallonga shVal = 25; MethodWide(ShVal); } }}

[/Kodo]

La produktado de ĉi tiu programo estas – int

  • Larĝiganta taktojn Varargs – Kiam estas situacio elekti inter larĝiganta kaj varargs, Larĝiganta prenas la preferon –

Listing5: Ekzempla kodo montranta troŝarĝanta preferon

[Kodo]

Publika klaso WideVarArgs {

Senmova malplena methodWideVar(Int i1, Int i2) {

Sistemo.Ekstere.Println(“Int int”);

}

Senmova malplena methodWideVar(Integralo… I) {

Sistemo.Ekstere.Println(“Integraloj”);

} Publika senmova malplena ĉefa( Ŝnuro[] Args) {

Mallonga shVal1 = 25;

Mallonga shVal2 = 35;

MethodWideVar( ShVal1, ShVal2);

}

}

[/Kodo]

  • Boksanta taktojn Varargs – Kiam estas situacio elekti inter bokso kaj varargs, Boksanta prenas la preferon –

Listing6: Ekzempla kodo montranta troŝarĝanta preferon

[Kodo]

Publika klaso BoxVarargs {

Senmova malplena methodBoxVar(Integralo en) {

Sistemo.Ekstere.Println(“Integralo”);

}

Senmova malplena methodBoxVar(Integralo… I) {

Sistemo.Ekstere.Println(“Integraloj”);

}

Publika senmova malplena ĉefa(Ŝnuro[] Args) {

Int intVal1 = 25;

MethodBoxVar(IntVal1);

}

}

[/Kodo]

Aferoj al memoras por uzi Autoboxing –

Kiel ni scias ke ĉiu bona ĉefaĵo venas kun kelkaj malavantaĝoj, Autoboxing ne estas escepto en ĉi tiu konsidero. Kelkaj gravaj kugloj kiu ellaboranto devus teni en menso dum uzanta ĉi tiun ĉefaĵon estas kiel nesufiĉe –

  • Komparanta objektojn kun egaleca operacianto – La egaleca operacianto – ‘==' kondukoj al konfuzo kiel ĝi povas esti aplikita al ambaŭ primitivaj datumaj tipoj kaj la objekto. Kiam la operacianto estas aplikita sur objektoj, Ĝi efektive komparas la referencon de la objektoj kaj ne la valoroj.

Listing7: Ekzempla kodo montranta komparon

[Kodo]

Publika klasa Komparilo {

Publika senmova malplena ĉefa(Ŝnuro[] Args) {

Integralo istInt = nova Integralo(1);

Integralo secondInt = nova Integralo(1);

Se (IstInt == secondInt) {

Sistemo.Ekstere.Println(“Ambaŭ unu estas egala”);

} Alia {

Sistemo.Ekstere.Println(“Ambaŭ unu ne estas egala”);

}

}

}

[/Kodo]

  • Miksanta objekton kaj primitiva en egaleco kaj interrilata operacianto – Se ni komparas primitivan datuman tipon kun objekto, Tiam la unboxing okazas kiun povas ĵeti NullPointerException se la objekto estas null.
  • Cached Objekto – Ekde la valueOf()Metodo estas uzita krei boksita primitivajn objektojn, La uzita objektojn estas cached. Pro tio ke java konservejaj integraloj de -128 Al 128, Ĉi tiuj cached objektoj povas konduti malsame.
  • Elfara degenero – Autoboxing aŭ unboxing degeneras la elfaron de apliko kiel ĝi kreas nedeziratan objekton kiu gvidas la GC kuri pli ofte.

Malavantaĝo de Autoboxing

Kvankam autoboxing havas plurajn avantaĝojn, Ĝi havas la sekvantan malavantaĝon –

  • Se autoboxing okazas ene de maŝo nenecesaj objektoj akiras kreita kaj ĝi povas malrapidigi malsupren la elfaron de la apliko. Konsideri la sekvantan kodon –

Listing8: Ekzempla kodo montranta elfaran aferon

[Kodo]

Publika int sumEvenNumbers(Listo<Integralo> IntList) { Int sumo = 0; Por (Integralo i: IntList) Se ( I % 2 == 0 ) Sumo = i; Revena sumo;}

[/Kodo]

En ĉi tiu peco de kodo, [Kodo] Sumo = i; [/Kodo] Vastigos kiel [Kodo] Suma = sumo + I; [/Kodo]. Pro tio ke la ‘ ' operacio ne povas esti farita sur Integrala objekto, La JVM ekkaŭzas la unboxing de suma Integralo Objekto kaj tiam la rezulto estas autoboxed malantaŭo.

  • Antaŭ jdk 1.5, Datumaj tipoj int kaj Integralo estis klara kaj en kazo de metodo troŝarĝanta ĉi tiuj du tipoj estis uzita sen ajna ĝenaĵo. Nun kun autoboxing kaj unboxing, Tio ĉi fariĝis pli delikata. Ekzemplo de tio ĉi estas la troŝarĝita forigi metodon en ArrayList. Klaso ArrayList havas du forigas metodojn – forigas (Indekso) Kaj forigi (Objekto). En ĉi tiu kazo, Metodo troŝarĝanta ne okazos kaj la respektiva metodo estos vokita kun konvenaj parametroj.

Konkludo

Autoboxing estas la mekanismo al sekreta primitiva datuma tipo en respektiva envolvaĵo aŭ Objekto. Compiler uzas valueOf() Metodo transformi primitivan Kontraŭargumenti kaj uzoj intValue(), DoubleValue() Ktp. akiri primitivan valoron de Objekto. En autoboxing, boolea estas transformita al Boolea, Byte al Byte, Cindrigi al Karaktero, Flosigi ŝanĝojn Flosigi, Int iras al Integralo, Longe iras al Longa kaj mallonga transformas al Mallonga, Dum en unboxing la konvertiĝo okazas en la inversa direkto.

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

Enjoy this blog? Please spread the word :)

Follow by Email
LinkedIn
LinkedIn
Share