System.out.println(i3==i4),為什麼輸出的結果不是true
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);
}
}
迷茫2017-06-28 09:26:50
首先我們知道,物件類型在做==時是比較其引用的記憶體位址。所以在樓主這個demo中,原則上i1==i2,i3==i4比較的都是其引用的記憶體位址,應該都是false。但是,java在java5引入了Integer快取機制,當開發者使用Integer類型時,如果定義的值在-128~127之間時,會將引用直接指向已建立好的快取物件。
在樓主的demo中,i1,i2兩個變數在-128~127之間,所以兩個變數的引用是指向同一個物件實例(記憶體位址相同),所以傳回true,而i3,i4兩個變數的值不在-128~127之間,所以jvm分別為這兩個自動裝箱的物件類型,創建了新的物件實例(記憶體位址不同),所以回傳false。
Integer快取機制的最大值可以透過jvm參數-XX:AutoBoxCacheMax=size來調整。有關Integer整型的細節及原理,請參考這篇部落格。 http://blog.csdn.net/u0110040...