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從字面上面理解是乙個快取類,我們去看看一下這個類的結構:
從這裡我們可以知道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的;
Integer原始碼解析
public class test else integer i3 200 integer i4 200 if i3 i4 else 結果為 原因integer 類會快取 128 到 127 之間的整數 但是如果new interger的話就是不同的物件了 源 分析 如果是在 128到正的127之間...
Integer原始碼學習筆記
1 public final class integer extends number implements comparable2 tostring 方法先得到引數i的長度,然後以該長度生成char型別的buf陣列,最後以該buf陣列作為引數呼叫new string buf,true 生成乙個st...
Integer原始碼(toString)解析
public static string tostring int i 同樣,為了便於理解,我舉個具體的例子 integer.tostring 173 1 int size i 0 stringsize i 1 stringsize i 看這一行的stringsize i 方法 判斷這個value ...