Integer常量池結合源碼解析

1.Integer存在緩存嗎?i == j會返回什麼

舉例一:Integer i = 10;

Integer j = new Integer(10)

舉例二:Integer a = 128;

Integer b = 128;

舉例三:Integer j= 129;

int k = j;

解:i在編譯的時候實際上是調用了Integer.ValueOf裝箱方法,反編譯之後變成:Integer i = Integer.valueOf(10);

Integer j = new Integer(10);

 

我們一步來閱讀源碼:

第一步的時候

 

對傳入的值有一個判斷, IntegerCache從字面上面理解是一個緩存類,我們去看看一下這個類的結構:

for(int k = 0; k < cache.length; k++)
    cache[k] = new Integer(j++);

從這裏我們可以知道IntegerCache的low=-128和high=127,所以我們可以得出valueOf()源碼對i範圍的判斷其實就是-128至127,而這個IntegerCache存入的緩存也是-128—127區間的,回答了Integer是存在緩存的;

其次,我們可以看到如果超出這個範圍,valueOf方法其實是返回new Integer()對象的,此時就可以回答舉例一和二的答案:

  1. i==j是返回false,因爲是值和內存地址在比較是錯誤的;
  2. a ==b 超出了常量池的範圍,返回是對象內存地址,所以也是false的;

 

而要回答第三個舉例:這裏就涉及到裝箱和拆箱,Integer j= 129這裏是自動裝箱,而自動裝箱值如果符合-128—127範圍內,就直接從緩存(常量池)裏返回,如果大於就返回對象, int k = j屬於自動拆箱,賦值引用,指向的是同一個內存空間值,這樣是返回true的;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章