Penjelasan terperinci tentang pengemasan dan unboxing java
Kata pengantar:
Untuk memahami konsep pengepakan dan unboxing, Anda harus memahami tipe data Java
Kotak: Paket tipe dasar dengan jenis referensi yang sesuai untuk membuatnya memiliki sifat objek. Int dikemas ke integer, mengapung dikemas ke dalam float
Unboxing: Berbeda dengan tinju, menyederhanakan objek jenis referensi ke data jenis nilai
Integer A = 100;
Lihat kode berikut
M1
DataType Public {public static void Main (String args []) {DataType dt = New DataType (); Eger A = Integer Baru (128); System.out.println ("Hasil M12" + (a == b));Apa hasil cetaknya?
M11 Hasil False M12 Hasil Salah
"==" membandingkan alamat, sedangkan alamat dari dua objek A dan B berbeda, yaitu, mereka adalah dua objek, sehingga keduanya salah
Parsing bytecode melalui javap, kontennya adalah sebagai berikut
Public M11 (); 0: baru #44; A/Lang/Integer; Java/Lang/System. _2 30: IF_ACMPNE 37 33: ICONST_1 34: GOTO 38 37: ICONTST_0 38: Invokevirtual #66; Java/Lang/StringBuilder.Pelana: (Z) Ljava/Lang/StringBuilder; V 47: Return public void M12 (); // Metode Java/Lang/Integer. "<inin>" :( I) v 10: Store_1 11: Sipush 128 14: Invokestatic #49; : baru #59; // kelas java/lang/stringbuilder 24: dup 25: ldc #82; Invokespecial #63; // Metode Java/Lang/StringBuilder. Invokevirtual #74; // Metode Java/io/printStream.println: (ljava/lang/string;) v 49: return </itin> </itin> </itin> </init>
M2
DataType Public {public static void Main (String args []) {DataType dt = New DataType (); oid m22 () {integer a = new integer (128); Integer (128);Hasil cetaknya adalah
M21 Hasil falsem22 hasil false
A dan B masih dua objek
Konten parsing javap
Public Void M21 (); ; // Metode Java/Lang/Integer. " Java/Lang/System. : aload_2 34: if_acmpne 41 37: iconst_1 38: goto 42 41: iconst_0 42: invokevirtual #66; Java/Lang/StringBuilder.Pelana: (Z) Ljava/Lang/StringBuilder; V 51: returnPublic void m22 (); // Metode Java/Lang/Integer. "<inin>" :( i) v 10: Store_1 11: Baru #44; : Ljava/io/printstream; 25: baru #59; 47: Invokevirtual #70; // Metode Java/Lang/StringBuilder Ilder; java/lang/stringbuilder.tostring :() ljava/lang/string;
M3
Kelas publik {public static void Main (String args []) {DataType dt = New DataType (); = 128; }}Hasil cetak
M31 Hasil Truem32 Hasil Salah
Mengapa ada yang pertama dan yang kedua salah? Amati data yang diuraikan oleh javap
Konten parsing javap
Kode M31 () public void; 2 12: Getstatic #53; Java/Lang/StringBuilder 18: Dup 19: LDC #88; // String M31 Hasil 21: Invokespecial #63; #70; /Lang/integer.valueof :(i)ljava/lang/integer; Java/Lang/Integer.valueof: (i) Ljava/Lang/Integer; #63; // Metode Java/Lang/StringBuilder. "<inin>" :( ljava/lang/string;) v 26: aload_1 27: aload_2 28: IF_ACMPNE 35 31: ICONTST_1 32: GOTO 36 35: ICONST_0 36: Invokevirtual #66; 42: Invokevirtual #74; // Metode Java/IO/PrintString.println: (Ljava/Lang/String;) V 45: Return
M4
Public DataType {public static void Main (String args []) {DataType dt = New DataType () 42 () {integer a = integer.valueof (128); System.out.println ("Hasil M42" + (a == b));Hasil cetak
M41 Hasil Truem42 Hasil Salah
Konten parsing javap
Public M41 (); 2 12: Getstatic #53; Java/Lang/StringBuilder 18: Dup 19: LDC #92; // String M41 Hasil 21: Invokespecial #63; #70; /Lang/integer.valueof :(i)ljava/lang/integer; Java/Lang/Integer.valueof: (i) Ljava/Lang/Integer; #63; // Metode Java/Lang/StringBuilder. "<inin>" :( ljava/lang/string;) v 26: aload_1 27: aload_2 28: IF_ACMPNE 35 31: ICONTST_1 32: GOTO 36 35: ICONST_0 36: Invokevirtual #66; 42: Invokevirtual #74; // Metode Java/io/printStream.println: (ljava/lang/string;) V 45: return}
menganalisa
JAVAP adalah alat yang dilengkapi dengan Java.
Mari kita lihat M4 terlebih dahulu.
Tetapi objek A dihasilkan dengan memanggil integer.valueof (), dan B adalah objek yang dihasilkan oleh tinju otomatis. Lagipula mari kita lihat bytecode.
Metode M41 hanya menerapkan nilai dari () sekali, tetapi muncul dua kali dalam bytecode, yang berarti bahwa nilai () juga dipanggil selama tinju otomatis.
Berikut ini adalah implementasi spesifik dari nilai ()
/** * Returns a <tt>Integer</tt> instance representing the specified * <tt>int</tt> value. * If a new <tt>Integer</tt> instance is not required, this method * should generally be used in preference to the constructor * {@link #Integer(int)}, as this method is likely to yield * significantly better space and time performance by caching * frequently requested values. * * @param i an <code>int</code> value. * @return a <tt>Integer</tt> instance representing <tt>i</tt>. * @since 1.5 */public static Integer valueOf(int i) {final int offset = 128;if (i >= -128 && i <= 127) { // must cache return IntegerCache.cache[i + offset];} return new Integer(i);}Dalam angka antara [-128, 127], Nilai mengembalikan objek dalam cache, sehingga kedua panggilan mengembalikan objek yang sama.
Terima kasih telah membaca, saya harap ini dapat membantu Anda.