關於Integer快取
阿新 • • 發佈:2018-12-19
先上程式碼
public class TestInteger {
public static void main(String[] args) {
Integer a =100;
Integer b =100;
System.out.println(a==b);
Integer a1 = 200;
Integer a2 = 200;
System.out.println(a1==a2);
}
}
結果是
為什麼會出現這個結果呢?
我們都知道“==”如果是基本數值型,那麼比較的就是數字是否相等,如果比較的是引用資料型別,那麼比較的就是兩個的地址。
在這裡Integer是引用資料型別,那麼應該比較地址,在直接給Integer賦值的時候,就相當於new了一個新的物件啊,那這樣不是應該返回false嗎,為什麼上面的結果是true,而下面的結果是false呢?
通過編譯,然後javap -c 反彙編檢視呼叫
可以看到呼叫的是Integer.valueOf()方法,在原始碼中找到這個方法
先說說if條件的內容,這判斷了一個範圍,這些都寫在一個內部類IntegerCache(快取)中,範圍是-128到127
valueOf()方法很清晰的告訴了只有當i不在這個範圍的時候,他才會new 一個新的Integer物件,在這個範圍的時候,會返回快取中的值,讓該引用指向快取中數值。這樣就很好理解為什麼第一個是true第二個是false了
第一對在快取的範圍內,所以兩個引用指向同一個物件,返回true
第二對不在快取的範圍內,所以兩個都是new出來的,所以地址不同,返回false