1. 程式人生 > >關於Integer快取

關於Integer快取

先上程式碼

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