JavaRush /Blog Java /Random-MS /Autoboxing dan unboxing dalam Java

Autoboxing dan unboxing dalam Java

Diterbitkan dalam kumpulan
Dalam artikel ini kita akan melihat ciri dalam Java yang dipanggil autoboxing/unboxing . Autoboxing dan unboxing ialah fungsi menukar jenis primitif kepada jenis objek dan sebaliknya. Autoboxing dan unboxing dalam Java - 1Keseluruhan proses dilakukan secara automatik oleh Java Runtime Environment (JRE). Tetapi anda harus berhati-hati apabila melaksanakan fungsi ini, kerana... Ia boleh menjejaskan prestasi program anda.

pengenalan

Dalam versi di bawah JDK 1.5, bukan mudah untuk menukar jenis data primitif seperti int, char, float, doublekepada kelas pembalut Integer, Character, Float, Double. Bermula dengan JDK 5, fungsi ini, menukar jenis primitif kepada objek yang setara, dilaksanakan secara automatik. Hartanah ini dikenali sebagai Autoboxing . Proses terbalik, masing-masing, ialah Unboxing , i.e. proses menukar objek kepada jenis primitif yang sepadan. Contoh kod untuk autoboxing dan unboxing diberikan di bawah: Autoboxing
Integer integer = 9;
Membuka kotak
int in = 0;
in = new Integer(9);
Bilakah pembungkusan dan pembongkaran automatik digunakan? Autoboxing digunakan oleh pengkompil Java di bawah keadaan berikut:
  • Apabila nilai jenis primitif dihantar kepada kaedah sebagai parameter kaedah, yang menjangkakan objek daripada kelas pembalut yang sepadan.
  • Apabila nilai jenis primitif diberikan kepada pembolehubah kelas pembalut yang sepadan.
Pertimbangkan contoh berikut: Penyenaraian 1: Kod ringkas yang menunjukkan 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, kod di atas akan menyebabkan ralat penyusunan kerana baki operator % dan unary plus += tidak boleh digunakan pada kelas pembalut. Tetapi dalam jdk 1.5 dan ke atas kod ini disusun tanpa ralat, menukar Integer kepada int. Unboxing digunakan oleh pengkompil Java di bawah keadaan berikut:
  • Apabila objek diluluskan sebagai parameter kepada kaedah yang menjangkakan jenis primitif yang sepadan.
  • Apabila objek ditugaskan kepada pembolehubah jenis primitif yang sepadan.
Pertimbangkan contoh berikut: Penyenaraian 2: Kod ringkas yang menunjukkan pembuka kotak
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 membolehkan pembangun menulis kod yang mudah dibaca dan difahami. Jadual berikut menunjukkan jenis data primitif dan objek pembalut yang sepadan.
Jenis primitif Kelas Shell
boolean Boolean
bait Bait
char Perwatakan
terapung Terapung
int Integer
panjang Panjang
pendek Pendek
Jadual 1: Jenis primitif dan kelas pembalut yang setara dengan operator perbandingan Autoboxing dan unboxing boleh digunakan dengan operator perbandingan. Coretan kod berikut menggambarkan bagaimana ini berlaku: Penyenaraian 3: Kod sampel menunjukkan 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);
  }
}
Autopacking dan unpacking apabila terlebih muatan kaedah Autopacking dan unpacking dilakukan apabila terlebih muatan kaedah berdasarkan peraturan berikut:
  • Pengembangan "mengalahkan" pembungkusan dalam situasi di mana terdapat pilihan antara pengembangan dan pembungkusan; pengembangan adalah lebih baik.
Penyenaraian 4: Kod sampel yang menunjukkan faedah lebihan muatan
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 - jenisint
  • Pengembangan mengalahkan bilangan argumen yang berubah-ubah Dalam situasi di mana ia menjadi pilihan antara pengembangan dan bilangan argumen yang berubah-ubah, pengembangan adalah lebih baik.
Penyenaraian 5: Kod sampel yang menunjukkan faedah lebihan 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);
   }
  }
  • Pembungkusan mengalahkan bilangan argumen yang berubah-ubah Dalam situasi di mana ia menjadi pilihan antara pembungkusan dan bilangan argumen yang berubah-ubah, pembungkusan adalah lebih baik.
Penyenaraian 6: Kod sampel yang menunjukkan faedah lebihan 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 mengingati perkara berikut semasa menggunakan Pembungkusan Auto: Seperti yang kita ketahui, setiap ciri yang baik mempunyai kelemahan. Pembungkusan automatik tidak terkecuali dalam hal ini. Beberapa nota penting yang perlu diingat oleh pembangun apabila menggunakan ciri ini:
  • Membandingkan objek dengan ==operator ' ' boleh mengelirukan, kerana ia boleh digunakan pada jenis dan objek primitif. Apabila pengendali ini digunakan pada objek, ia sebenarnya membandingkan rujukan kepada objek, bukan objek itu sendiri.
Penyenaraian 7: Kod sampel 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");
      }
   }
}
  • Mencampurkan objek dan jenis primitif dengan kesamaan dan pengendali hubungan. Jika kita membandingkan jenis primitif dengan objek, maka objek itu dinyahkotak, yang boleh membuang NullPointerExceptionjika objek null.
  • Caching objek. Kaedah ini valueOf()mencipta bekas objek primitif yang dicache. Oleh kerana nilai dicache dalam julat -128 hingga 127, termasuk, objek cache ini mungkin berkelakuan berbeza.
  • Kemerosotan prestasi. Autoboxing atau unboxing merendahkan prestasi aplikasi kerana ia mencipta objek yang tidak diingini yang memaksa pemungut sampah berjalan dengan lebih kerap.
Kelemahan AutoBoxing Walaupun AutoBoxing mempunyai beberapa kelebihan, ia mempunyai kelemahan berikut: Penyenaraian 8: Kod sampel yang menunjukkan isu prestasi.
public int sumEvenNumbers(List intList) {
          int sum = 0;
          for (Integer i : intList) {
              if (i % 2 == 0) {
                  sum += i;
              }
          }
         return sum;
   }
Dalam bahagian kod ini, sum +=i ia akan dikembangkan kepada sum = sum + i. Bermula dengan +operator ' ', JVM mula membuka kotak kerana +operator ' ' tidak boleh digunakan pada objek Integer. Dan kemudian hasilnya dibungkus semula secara automatik. Sebelum JDK 1.5, jenis data intdan Integer adalah berbeza. Dalam kes kelebihan beban kaedah, kedua-dua jenis ini digunakan tanpa masalah. Dengan kemunculan pembungkusan / pembongkaran automatik, ini menjadi lebih sukar. Contoh ini ialah kaedah terlebih beban remove()dalam ArrayList. Kelas ArrayListmempunyai dua kaedah padam - remove(index)dan remove(object). Dalam kes ini, kelebihan beban kaedah tidak akan berlaku dan kaedah yang sepadan akan dipanggil dengan parameter yang sesuai.

Kesimpulan

Autoboxing ialah mekanisme untuk secara tersirat menukar jenis data primitif kepada kelas pembalut yang sepadan (objek). Pengkompil menggunakan kaedah valueOf()untuk menukar jenis primitif kepada objek, dan kaedah IntValue(), doubleValue()dsb., untuk mendapatkan jenis primitif objek. Autoboxing menukar jenis boolean booleankepada Boolean, bytekepada Byte, charkepada Aksara, floatkepada Terapung, intkepada Integer, longkepada Panjang, shortkepada Pendek. Pembongkaran berlaku dalam arah sebaliknya. Artikel asal
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION