System.out.println(i3==i4), mengapa keputusan output tidak benar
class Demo
{
public static void main(String[] arge)
{
Integer i1=100;
Integer i2=100;
Integer i3=200;
Integer i4=200;
System.out.println(i1==i2);
System.out.println(i3==i4);
}
}
Pertama sekali, kita tahu bahawa jenis objek membandingkan alamat memori yang dirujuknya semasa melakukan ==. Jadi dalam demo poster asal, pada dasarnya, i1==i2 dan i3==i4 membandingkan alamat memori yang mereka rujuk, yang sepatutnya kedua-duanya palsu. Walau bagaimanapun, Java memperkenalkan mekanisme caching Integer dalam Java5 Apabila pembangun menggunakan jenis Integer, jika nilai yang ditentukan adalah antara -128~127, rujukan akan dihalakan terus ke objek cache yang dibuat.
Dalam demo poster, kedua-dua pembolehubah i1 dan i2 adalah antara -128~127, jadi rujukan kedua-dua pembolehubah menghala ke contoh objek yang sama (alamat memori yang sama), jadi benar dikembalikan, manakala dua pembolehubah i3 dan i4 Nilainya bukan antara -128~127, jadi jvm mencipta contoh objek baharu (alamat memori yang berbeza) untuk kedua-dua jenis objek berkotak secara automatik ini, jadi ia mengembalikan palsu.
Nilai maksimum mekanisme cache Integer boleh dilaraskan melalui parameter jvm -XX:AutoBoxCacheMax=size. Untuk butiran dan prinsip Integer, sila rujuk blog ini. http://blog.csdn.net/u0110040...
Kelas pembungkus plastik akan cache objek integer dari 0 hingga 150, jadi jika kurang daripada 150, cache akan digunakan semasa tinju 100 ialah objek dalam cache, dan 200 ialah objek yang baru dibuat