Integer的自動裝箱過程

先來看道題

 int  a=100;

 int  b=100;

 Integer  c=a;

 Integer  d=b;

 System.out.println(a==b);
 System.out.println(c==d);

其實這道題  和  a 與  b 沒有什麼關係,可以直接看成

  Integer c=100;
  Integer d=100;

System.out.println(c==d); 

執行結果爲 true 

 當是如果把題目改爲

  Integer c=200;
Integer d=200;

System.out.println(c==d);

執行結果卻爲false

這是爲什麼呢?

這就涉及到 Integer  的自動裝箱了,

 我們都知道Integer是一個 類 不是基本類型數據,但是爲什麼它可以直接像基本類型數據一樣可以直接賦值.

 這是在jdk1.5  之後引入的 自動裝箱和自動拆箱.

 上面的問題實際上是使用了  Integer.valueOf()進行自動裝箱的.

 等同於   

Integer c=Integer.valueOf(100);

對於爲什麼上面兩個問題的執行結果會有不同,我們就需要看 Integer.valueOf()的源碼了  

    public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

IntegerCache.high和IntegerCache.low默認分別爲    127  和-128

如果傳入的值是在-128~127之間就會建立Integer實例並且把實例放入緩存中,

當再傳入的值是緩存中存在的,就會把緩存中的實例返回.

如果不在 -128~127之間就不會把 實例放入緩存中.直接返回一個實例.


內容部分參考java jdk7 學習筆記






發佈了34 篇原創文章 · 獲贊 45 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章