Mari kita lihat sepotong kode:
kelas publik utama {public static void main (string [] args) {integer num1 = 100; Integer num2 = 100; Integer num3 = 200; Integer num4 = 200; '' '// hasil output' '' System.out.println (num1 == num2); System.out.println (num3 == num4); }} Tebak apa hasilnya?
Banyak orang berpikir bahwa hasilnya benar, tetapi hasilnya tidak seperti ini.
BENAR
PALSU
Mengapa hasil ini? Jika hasilnya dijelaskan oleh memori, NUM1 dan NUM2 menunjuk ke objek yang sama, sedangkan NUM3 dan NUM4 menunjuk ke objek yang berbeda. Selanjutnya, mari kita beri tahu Anda alasannya, lihat kode sumber dari metode nilai tipe integer:
Nilai integer statis publik (int i) {Assert integercache.high> = 127; if (i> = integercache.low && i <= integercache.high) mengembalikan integercache.cache [i + 128]; mengembalikan bilangan bulat baru (i); }Implementasi Integercache:
'' '// integercache, kelas internal, perhatikan bahwa propertinya didefinisikan sebagai final statis' '' kelas statis private integercache {static final int high; '' '// Cache Bound Atas, untuk sementara null' '' cache integer final statis []; '' '// Cache Integer Array' '' '' '// Block, mengapa didefinisikan sebagai blok' '' static {final int low = -128; '' '// Cache Bound Bawah, Immutable. Hanya batas atas yang dapat mengubah '' '' '' '' // Nilai tinggi yang dapat dikonfigurasi dengan properti '' '' '' // H Nilai, yang dapat disesuaikan dengan mengatur parameter AutoboxCachemax JDK (ada penjelasan di bawah), dan interval cache otomatis diatur ke [-128, n]. Perhatikan bahwa batas bawah interval ditetapkan int h = 127; if (integercacheHighpropValue! = null) {'' '// gunakan long.decode di sini untuk menghindari metode yang memohon bahwa' '' '' // membutuhkan cache otoboksing integer untuk diinisialisasi '' '// dengan decoding integercachehighpropValue, nilai candidate yang diperoleh' '' Long.decode (integercacheHighPropValue) .IntValue (); '' '// Ambil yang lebih besar sebagai batas atas, tetapi tidak bisa lebih besar dari batas integer max_value' '' i = math.max (i, 127); '' '// Ukuran array maksimum adalah integer.max_value' '' h = math.min (i, integer.max_value - -low); } tinggi = h; '' '// Batas atas ditentukan' '' '' '' // Anda dapat membuat blok cache, perhatikan ukuran array cache '' 'cache = bilangan bulat baru [(tinggi - rendah) + 1]; // int j = rendah; untuk (int k = 0; k <cache.length; k ++) cache [k] = bilangan bulat baru (j ++); '' '// -128 ke nilai tinggi dialokasikan untuk cache array satu per satu' ''} private integercache () {}}Melalui dua potong kode ini, dapat dilihat bahwa saat membuat objek tipe integer melalui metode nilai, rentang nilai adalah [-128, 127]. Dalam interval ini, pointer menunjuk ke referensi objek yang sudah ada di integercache.cache. Ketika nilai melebihi rentang ini, objek baru akan dibuat.
Satu hal yang perlu diperhatikan adalah bahwa tidak semua jenis ada dalam kisaran ini, lihat tipe ganda:
kelas publik {public static void main (string [] args) {double i1 = 100.0; I2 ganda = 100.0; Double I3 = 200.0; I4 ganda = 200.0; System.out.println (i1 == i2); System.out.println (i3 == i4); }}Hasil output akhir:
PALSU
PALSU
Untuk alasan spesifik mengapa ini adalah hasilnya, Anda dapat memeriksa implementasi metode nilai ganda dalam kode sumber. Ini berbeda dari metode nilai integer karena jumlah nilai integer dalam kisaran tertentu terbatas, tetapi angka titik mengambang tidak.
Perhatikan bahwa implementasi nilai metode integer, pendek, byte, karakter, dan panjang serupa.
Implementasi nilai metode ganda dan float serupa.
Tarik satu, dan hasil tipe boolean memiliki dua benar atau salah. Lihat langsung pada kode sumber:
Nilai boolean statis publik (boolean b) {return (b? true: false); }Yang benar dan salah didefinisikan sebagai berikut:
public static final boolean true = boolean baru (true); '' '/**' '' '' '' '** The <code> boolean </code> objek yang sesuai dengan nilai primitif' '' '' ''* <code> false </code>. '' '' '' **/'' '' '' '' '' ''*public static final boolean false = boolean baru (false);
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.