Integer常量池結合原始碼解析

2021-09-27 11:47:04 字數 1074 閱讀 2059

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 ...