Integer 中的快取類IntegerCache

2021-08-21 02:49:21 字數 1400 閱讀 7770

2023年去某公司筆試的時候遇到這麼一道題:

public

class

test

}

問列印的結果的多少? 但是我回答的是false, 後來仔細想想應該沒有這個簡單,就翻了下jdk的原始碼,發現:

public

static integer valueof(string s) throws

numberformatexception

public

static integer valueof(int

i)

發現裡面另有玄機,多了個integercache類:

private

static

class

integercache

catch

( numberformatexception nfe)

}high =h;

cache = new integer[(high - low) + 1];

int j =low;

for(int k = 0; k < cache.length; k++)

cache[k] = new integer(j++);

//range [-128, 127] must be interned (jls7 5.1.7)

assert integercache.high >= 127;

}private

integercache() {}

}

原來integer把-128到127(可調)的整數都提前例項化了。 這就解釋了那道面試題的答案,原來你不管建立多少個這個範圍內的integer用valueof出來的都是同乙個物件。

但是為什麼jdk要這麼多此一舉呢? 我們仔細想想, **的商品大多數都是100以內的**, 一天後台伺服器會new多少個這個的integer, 用了integercache,就減少了new的時間也就提公升了效率。同時jdk還提供cache中high值得可配置,

這無疑提高了靈活性,方便對jvm進行優化。

參考long的原始碼:

private

static

class

longcache

static

final long cache = new long[-(-128) + 127 + 1];

static

}

long也做了快取,只是沒有提供調整機制, 在short中類似:

private

static

class

shortcache

static

final short cache = new short[-(-128) + 127 + 1];

static

}

Integer 中的快取類IntegerCache

題目 public class test 結果是 true false true可是為什麼呢?翻閱dk的原始碼,發現 public static integer valueof string s throws numberformatexception public static integer v...

Integer類的快取機制

檢視integer的原始碼,就會發現裡面有個靜態內部類。該類的作用是將數值等於 128 127 預設 區間的integer例項快取到cache陣列中。通過valueof 方法很明顯發現,當再次建立值在 128 127區間的integer例項時,會復用快取中的例項,也就是直接指向快取中的integer...

Integer 和int的區別

1.int是基本的資料型別,直接存數值 2.integer是int的封裝類 integer 是物件,用乙個引用指向這個物件 integer 是乙個類,是int的擴充套件,定義了很多的轉換方法。3.int和integer都可以表示某乙個數值 4.int和integer不能夠互用,因為他們兩種不同的資料...