Mari kita lihat hasil tes terlebih dahulu:
/*public static void main (string [] args) {integer a = 128, b = 128; Integer C = 127, D = 127; System.out.println (a == b); // false system.out.println (c == d); // true}*//*public static void main (string [] args) {integer int1 = integer.valueof ("100"); Integer int2 = integer.valueof ("100"); System.out.println (int1 == int2); // true}*/public static void main (string [] args) {integer int1 = integer.valueof ("300"); Integer int2 = integer.valueof ("300"); System.out.println (int1 == int2); // false}Kode sumber JDK adalah sebagai berikut:
Nilai integer statis publik (string s) melempar NumberFormateException {return integer.valueof (parseInt (s, 10)); } Nilai integer statis publik (int i) {if (i> = integercache.low && i <= integercache.high) mengembalikan integercache.cache [i + (-integercercache.low)]; mengembalikan bilangan bulat baru (i); }Saya menemukan bahwa ada misteri lain di dalam, dan ada kelas integercache:
kelas statis private integercache {static final int low = -128; statis final int high; cache integer final statis []; static {// nilai tinggi dapat dikonfigurasi oleh properti int h = 127; String integercacheHighPropValue = sun.misc.vm.getsavedproperty ("java.lang.integer.integercache.high"); if (integercacheHighpropValue! = null) {coba {int i = parseInt (integercacheHighPropValue); i = Math.max (i, 127); // Ukuran array maksimum adalah integer.max_value h = math.min (i, integer.max_value -(-low) -1); } catch (NumberFormateException NFE) {// Jika properti tidak dapat diuraikan ke int, abaikan. }} tinggi = h; cache = bilangan bulat baru [(tinggi - rendah) + 1]; int j = rendah; untuk (int k = 0; k <cache.length; k ++) cache [k] = bilangan bulat baru (j ++); // rentang [-128, 127] harus diinternalisasi (JLS7 5.1.7) menegaskan integercache.high> = 127; } private integercache () {}}Ternyata Integer Instantiates semua bilangan bulat dari -128 hingga 127 (dapat disesuaikan).
Ini menjelaskan jawabannya. Ternyata tidak peduli berapa banyak bilangan bulat yang Anda buat dalam kisaran ini, mereka semua menggunakan nilai untuk menghasilkan objek yang sama.
Tetapi mengapa JDK harus melakukan banyak hal dengan cara ini? Mari kita pikirkan dengan cermat. Sebagian besar produk Taobao dihargai di bawah 100 yuan. Berapa banyak bilangan bulat yang akan digunakan di server backend dalam satu hari? Menggunakan integercache, ini mengurangi waktu untuk mendapatkan yang baru dan meningkatkan efisiensi. Pada saat yang sama, JDK juga menyediakan cache yang dapat dikonfigurasi dengan nilai tinggi.
Ini tidak diragukan lagi meningkatkan fleksibilitas dan memfasilitasi optimalisasi JVM.
Meringkaskan
Di atas adalah semua konten dari artikel ini tentang membaca kode sumber integercache Integer, saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!