JavaRush /Java Blog /Random-ID /Autoboxing dan unboxing di Java
DSergey_Kh
Level 12

Autoboxing dan unboxing di Java

Dipublikasikan di grup Random-ID
Pada artikel ini kita akan melihat fitur di Java yang disebut autoboxing/unboxing . Autoboxing dan unboxing adalah fungsi mengubah tipe primitif menjadi tipe objek dan sebaliknya. Autoboxing dan unboxing di Java - 1Seluruh proses dilakukan secara otomatis oleh Java Runtime Environment (JRE). Namun Anda harus berhati-hati saat mengimplementasikan fungsi ini, karena... Hal ini dapat mempengaruhi kinerja program Anda.

Perkenalan

Dalam versi di bawah JDK 1.5, tidak mudah untuk mengonversi tipe data primitif seperti int, char, float, doubleke kelas pembungkusnya Integer, Character, Float, Double. Dimulai dengan JDK 5, fungsi ini, yang mengubah tipe primitif menjadi objek setara, diimplementasikan secara otomatis. Properti ini dikenal sebagai Autoboxing . Proses sebaliknya masing-masing adalah Unboxing , yaitu. proses mengubah objek menjadi tipe primitifnya yang sesuai. Contoh kode untuk autoboxing dan unboxing diberikan di bawah ini: Autoboxing
Integer integer = 9;
Membuka kemasan
int in = 0;
in = new Integer(9);
Kapan pengepakan dan pembongkaran otomatis digunakan? Autoboxing digunakan oleh kompiler Java dalam kondisi berikut:
  • Ketika nilai tipe primitif diteruskan ke suatu metode sebagai parameter metode, yang mengharapkan objek dari kelas pembungkus yang sesuai.
  • Ketika nilai tipe primitif ditugaskan ke variabel kelas pembungkus yang sesuai.
Perhatikan contoh berikut: Listing 1: Kode sederhana yang menampilkan autoboxing
public int sumEvenNumbers(List<Integer> intList ) {
int sum = 0;
for (Integer i: intList )
if ( i % 2 == 0 )
sum += i;
return sum;
}
Sebelum jdk 1.5, kode di atas akan menyebabkan kesalahan kompilasi karena operator sisa % dan unary plus += tidak dapat diterapkan ke kelas wrapper. Namun di jdk 1.5 dan di atasnya kode ini dikompilasi tanpa kesalahan, mengubah Integer menjadi int. Unboxing digunakan oleh kompiler Java dalam kondisi berikut:
  • Ketika sebuah objek diteruskan sebagai parameter ke metode yang mengharapkan tipe primitif yang sesuai.
  • Ketika suatu objek ditugaskan ke variabel dengan tipe primitif yang sesuai.
Perhatikan contoh berikut: Listing 2: Kode sederhana yang menunjukkan 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 dan unboxing memungkinkan pengembang menulis kode yang mudah dibaca dan dipahami. Tabel berikut memperlihatkan tipe data primitif dan objek pembungkusnya yang sesuai.
Tipe primitif Kelas cangkang
boolean Boolean
byte byte
arang Karakter
mengambang Mengambang
ke dalam Bilangan bulat
panjang Panjang
pendek Pendek
Tabel 1: Tipe primitif dan kelas pembungkus yang setara dengan operator pembanding Autoboxing dan unboxing dapat digunakan dengan operator pembanding. Cuplikan kode berikut mengilustrasikan bagaimana hal ini terjadi: Listing 3: Contoh kode yang menampilkan autoboxing dan unboxing dengan operator perbandingan
public class BoxedComparator {
  public static void main(String[] args) {
      Integer in = new Integer(25);
      if (in < 35)
          System.out.println("Value of int = " + in);
  }
}
Pengemasan dan pembongkaran otomatis saat melakukan kelebihan beban pada suatu metode Pengemasan dan pembongkaran otomatis dilakukan saat melakukan kelebihan beban pada suatu metode berdasarkan aturan berikut:
  • Ekspansi “mengalahkan” pengemasan dalam situasi di mana terdapat pilihan antara ekspansi dan pengemasan; ekspansi lebih disukai.
Listing 4: Contoh kode yang menunjukkan manfaat kelebihan beban
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);
  }
 }
}
Keluaran program - ketikint
  • Ekspansi mengalahkan jumlah argumen yang bervariasi Dalam situasi di mana terdapat pilihan antara ekspansi dan jumlah argumen yang bervariasi, ekspansi lebih disukai.
Listing 5: Contoh kode yang menunjukkan manfaat kelebihan muatan
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);
   }
  }
  • Pengepakan mengalahkan jumlah argumen yang bervariasi Dalam situasi di mana harus memilih antara pengepakan dan jumlah argumen yang bervariasi, pengepakan lebih disukai.
Listing 6: Contoh kode yang menunjukkan manfaat kelebihan muatan
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);
    }
}
Anda harus mengingat hal-hal berikut saat menggunakan Auto Packing: Seperti yang kita ketahui, setiap fitur bagus pasti ada kekurangannya. Pengemasan otomatis tidak terkecuali dalam hal ini. Beberapa catatan penting yang harus diingat pengembang saat menggunakan fitur ini:
  • Membandingkan objek dengan ==operator ' ' dapat membingungkan, karena dapat diterapkan pada tipe dan objek primitif. Ketika operator ini diterapkan pada objek, operator ini sebenarnya membandingkan referensi ke objek tersebut, bukan objek itu sendiri.
Listing 7: Contoh kode yang menunjukkan 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");
      }
   }
}
  • Mencampur objek dan tipe primitif dengan persamaan dan operator relasional. Jika kita membandingkan tipe primitif dengan suatu objek, maka objek tersebut tidak dikotak-kotakkan, yang dapat dibuang NullPointerExceptionjika objek tersebut null.
  • Cache objek. Metode ini valueOf()membuat wadah objek primitif yang di-cache. Karena nilai-nilai di-cache dalam kisaran -128 hingga 127, inklusif, objek-objek yang di-cache ini mungkin berperilaku berbeda.
  • Penurunan kinerja. Autoboxing atau unboxing menurunkan kinerja aplikasi karena menciptakan objek yang tidak diinginkan yang memaksa pengumpul sampah untuk berjalan lebih sering.
Kekurangan AutoBoxing Meskipun AutoBoxing memiliki sejumlah kelebihan, namun memiliki kelemahan sebagai berikut: Listing 8: Contoh kode yang menunjukkan masalah kinerja.
public int sumEvenNumbers(List intList) {
          int sum = 0;
          for (Integer i : intList) {
              if (i % 2 == 0) {
                  sum += i;
              }
          }
         return sum;
   }
Di bagian kode ini, sum +=i akan diperluas menjadi sum = sum + i. Dimulai dengan +operator ' ', JVM mulai melakukan unboxing karena +operator ' ' tidak dapat diterapkan pada objek Integer. Dan kemudian hasilnya dikemas kembali secara otomatis. Sebelum JDK 1.5, tipe data intdan Integer berbeda. Jika terjadi kelebihan metode, kedua jenis ini digunakan tanpa masalah. Dengan munculnya pengepakan/pembongkaran otomatis, hal ini menjadi lebih sulit. Contohnya adalah metode kelebihan beban remove()di ArrayList. Kelas ArrayListmemiliki dua metode penghapusan - remove(index)dan remove(object). Dalam hal ini, metode yang berlebihan tidak akan terjadi dan metode yang sesuai akan dipanggil dengan parameter yang sesuai.

Kesimpulan

Autoboxing adalah mekanisme untuk secara implisit mengubah tipe data primitif menjadi kelas pembungkus (objek) yang sesuai. Kompiler menggunakan metode valueOf()untuk mengubah tipe primitif menjadi objek, dan metode IntValue(), doubleValue()dll., untuk mendapatkan tipe objek primitif. Autoboxing mengubah tipe boolean booleanmenjadi Boolean, bytemenjadi Byte, charmenjadi Karakter, floatmenjadi Float, intmenjadi Integer, longmenjadi Panjang, shortmenjadi Pendek. Pembongkaran terjadi dalam arah sebaliknya. Artikel asli
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION