JavaRush /Blog Jawa /Random-JV /Autoboxing lan unboxing ing Jawa
DSergey_Kh
tingkat

Autoboxing lan unboxing ing Jawa

Diterbitake ing grup
Ing artikel iki kita bakal ndeleng fitur ing Jawa sing diarani autoboxing/unboxing . Autoboxing lan unboxing minangka fungsi kanggo ngowahi jinis primitif dadi jinis obyek lan kosok balene. Autoboxing lan unboxing ing Jawa - 1Kabeh proses ditindakake kanthi otomatis dening Java Runtime Environment (JRE). Nanging sampeyan kudu ati-ati nalika ngetrapake fungsi iki, amarga ... Bisa mengaruhi kinerja program sampeyan.

Pambuka

Ing versi ing ngisor JDK 1.5, ora gampang ngowahi jinis data primitif kayata int, char, float, doublemenyang kelas bungkus Integer, Character, Float, Double. Miwiti karo JDK 5, fungsi iki, ngowahi jinis primitif dadi obyek sing padha, dileksanakake kanthi otomatis. Properti iki dikenal minangka Autoboxing . Proses mbalikke, mungguh, Unboxing , i.e. proses ngowahi obyek menyang jinis primitif sing cocog. Kode conto kanggo autoboxing lan unboxing diwenehi ing ngisor iki: Autoboxing
Integer integer = 9;
Unboxing
int in = 0;
in = new Integer(9);
Nalika packing otomatis lan unpacking digunakake? Autoboxing digunakake dening compiler Java ing kahanan ing ngisor iki:
  • Nalika Nilai saka jinis primitif liwati menyang cara minangka parameter cara, kang ngarepake obyek saka kelas pambungkus cocog.
  • Nalika Nilai saka jinis primitif diutus kanggo variabel saka kelas pambungkus cocog.
Coba conto ing ngisor iki: Listing 1: Kode prasaja sing nuduhake autoboxing
public int sumEvenNumbers(List<Integer> intList ) {
int sum = 0;
for (Integer i: intList )
if ( i % 2 == 0 )
sum += i;
return sum;
}
Sadurunge jdk 1.5, kode ing ndhuwur bakal nyebabake kesalahan kompilasi amarga sisa operator% lan unary plus += ora bisa ditrapake ing kelas pambungkus. Nanging ing jdk 1.5 lan ndhuwur kode iki kompilasi tanpa kasalahan, Ngonversi Integer kanggo int. Unboxing digunakake dening compiler Java ing kahanan ing ngisor iki:
  • Nalika obyek liwati minangka parameter kanggo cara sing ngarepake jinis primitif cocog.
  • Nalika obyek diutus kanggo variabel saka jinis primitif cocog.
Coba conto ing ngisor iki: Listing 2: Kode prasaja nuduhake unboxing
import java.util.ArrayList;
import java.util.List;

public class UnboxingCheck {

public static void main(String[] args) {
Integer in = new Integer(-8);

// 1. Распаковка через вызов метода
int absVal = absoluteValue(in);
System.out.println("absolute value of " + in + " = " + absVal);

List<Double> doubleList = new ArrayList<Double>();

// Автоупаковка через вызов метода
doubleList.add(3.1416);

// 2. Распаковка через присвоение
double phi = doubleList.get(0);
System.out.println("phi = " + phi);
}

public static int absoluteValue(int i) {
return (i < 0) ? -i : i;
}
}
Autoboxing lan unboxing ngidini pangembang nulis kode sing gampang diwaca lan dingerteni. Tabel ing ngisor iki nuduhake jinis data primitif lan obyek pambungkus sing cocog.
Jinis primitif Kelas Shell
boolean Boolean
bait Byte
char Watak
ngambang ngambang
int Ongko
dawa dawa
cendhak Singkat
Tabel 1: Jinis primitif lan kelas bungkus sing padha karo operator perbandingan Autoboxing lan unboxing bisa digunakake karo operator perbandingan. Cuplikan kode ing ngisor iki nggambarake kepiye kedadeyan kasebut: Listing 3: Kode conto sing nuduhake autoboxing lan unboxing karo operator pembanding
public class BoxedComparator {
  public static void main(String[] args) {
      Integer in = new Integer(25);
      if (in < 35)
          System.out.println("Value of int = " + in);
  }
}
Autopacking lan unpacking nalika overloading cara Autopacking lan unpacking ditindakake nalika overloading cara adhedhasar aturan ing ngisor iki:
  • Ekspansi "kalah" kemasan ing kahanan sing ana pilihan antarane ekspansi lan kemasan; ekspansi luwih disenengi.
Listing 4: Kode conto sing nuduhake keuntungan saka overloading
public class WideBoxed {
  public class WideBoxed {
  static void methodWide(int i) {
       System.out.println("int");
   }

  static void methodWide( Integer i ) {
      System.out.println("Integer");
  }

  public static void main(String[] args) {
      short shVal = 25;
      methodWide(shVal);
  }
 }
}
Output program - jinisint
  • Ekspansi ngalahake nomer variabel argumen Ing kahanan sing dadi pilihan antarane ekspansi lan nomer variabel argumen, ekspansi luwih disenengi.
Listing 5: Kode conto sing nuduhake keuntungan saka overloading
public class WideVarArgs {

    static void methodWideVar(int i1, int i2) {
      System.out.println("int int");
    }

    static void methodWideVar(Integer... i) {
       System.out.println("Integers");
    }

   public static void main( String[] args) {
       short shVal1 = 25;
      short shVal2 = 35;
     methodWideVar( shVal1, shVal2);
   }
  }
  • Packing ngalahaken nomer variabel argumen Ing kahanan sing dadi pilihan antarane packing lan nomer variabel argumen, packing luwih disenengi.
Listing 6: Kode conto sing nuduhake keuntungan saka overloading
public class BoxVarargs {
     static void methodBoxVar(Integer in) {
         System.out.println("Integer");
     }

     static void methodBoxVar(Integer... i) {
         System.out.println("Integers");
     }
     public static void main(String[] args) {
         int intVal1 = 25;
         methodBoxVar(intVal1);
    }
}
Sampeyan kudu mbudidaya bab ing ngisor iki nalika nggunakake Auto Packing: Kita ngerti, saben fitur apik duwe drawback. Packaging otomatis ora pangecualian ing babagan iki. Sawetara cathetan penting sing kudu dielingi pangembang nalika nggunakake fitur iki:
  • Mbandhingake obyek karo ==operator '' bisa mbingungake, amarga bisa ditrapake kanggo jinis lan obyek primitif. Nalika operator iki Applied kanggo obyek, iku bener mbandhingaké referensi kanggo obyek, ora obyek piyambak.
Listing 7: Kode conto sing nuduhake perbandingan.
public class Comparator {
   public static void main(String[] args) {
     Integer istInt = new Integer(1);
       Integer secondInt = new Integer(1);

       if (istInt == secondInt) {
         System.out.println("both one are equal");

       } else {
          System.out.println("Both one are not equal");
      }
   }
}
  • Nyampur obyek lan jinis primitif kanthi operator kesetaraan lan relasional. Yen kita mbandhingake jinis primitif karo obyek, banjur obyek wis unboxed, kang bisa uncalan NullPointerExceptionyen obyek null.
  • Caching obyek. Cara kasebut valueOf()nggawe wadhah obyek primitif sing disimpen. Amarga nilai-nilai sing di-cache ing kisaran -128 nganti 127, kalebu, obyek sing di-cache iki bisa tumindak kanthi beda.
  • Degradasi kinerja. Autoboxing utawa unboxing ngrusak kinerja aplikasi amarga nggawe obyek sing ora dikarepake sing meksa pengepul sampah luwih kerep mlaku.
Cacat AutoBoxing Senajan AutoBoxing wis sawetara kaluwihan, iku wis cacat ing ngisor iki: Listing 8: Kode sampel nuduhake masalah kinerja.
public int sumEvenNumbers(List intList) {
          int sum = 0;
          for (Integer i : intList) {
              if (i % 2 == 0) {
                  sum += i;
              }
          }
         return sum;
   }
Ing bagean kode iki, sum +=i bakal ditambahi dadi sum = sum + i. Miwiti karo +operator ' ', JVM wiwit mbukak kothak amarga +operator ' ' ora bisa ditrapake kanggo obyek Integer. Lan banjur asil autopacked bali. Sadurunge JDK 1.5, jinis data intlan Integer beda. Ing kasus overloading cara, rong jinis iki digunakake tanpa masalah. Kanthi tekane packing / unpacking otomatis, iki dadi luwih angel. Conto iki cara overloaded remove()ing ArrayList. Kelas ArrayListwis rong cara mbusak - remove(index)lan remove(object). Ing kasus iki, metode overloading ora bakal kedadeyan lan metode sing cocog bakal diarani kanthi paramèter sing cocog.

Kesimpulan

Autoboxing minangka mekanisme kanggo ngowahi jinis data primitif kanthi implisit dadi kelas pembungkus sing cocog (obyek). Compiler nggunakake metode valueOf()kanggo ngowahi jinis primitif dadi obyek, lan metode IntValue(), doubleValue()lan liya-liyane, kanggo entuk jinis primitif obyek kasebut. Autoboxing ngowahi jinis boolean booleandadi Boolean, bytedadi Byte, chardadi Karakter, floatdadi Float, intdadi Integer, longdadi Long, shortdadi Short. Unpacking occurs ing arah mbalikke. Artikel asli
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION