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()對象的,此時就可以回答舉例一和二的答案:
- i==j是返回false,因爲是值和內存地址在比較是錯誤的;
- a ==b 超出了常量池的範圍,返回是對象內存地址,所以也是false的;
而要回答第三個舉例:這裏就涉及到裝箱和拆箱,Integer j= 129這裏是自動裝箱,而自動裝箱值如果符合-128—127範圍內,就直接從緩存(常量池)裏返回,如果大於就返回對象, int k = j屬於自動拆箱,賦值引用,指向的是同一個內存空間值,這樣是返回true的;