2023年去某公司筆試的時候遇到這麼一道題:
public問列印的結果的多少? 但是我回答的是false, 後來仔細想想應該沒有這個簡單,就翻了下jdk的原始碼,發現:class
test
}
public發現裡面另有玄機,多了個integercache類:static integer valueof(string s) throws
numberformatexception
public
static integer valueof(int
i)
private原來integer把-128到127(可調)的整數都提前例項化了。 這就解釋了那道面試題的答案,原來你不管建立多少個這個範圍內的integer用valueof出來的都是同乙個物件。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() {}
}
但是為什麼jdk要這麼多此一舉呢? 我們仔細想想, **的商品大多數都是100以內的**, 一天後台伺服器會new多少個這個的integer, 用了integercache,就減少了new的時間也就提公升了效率。同時jdk還提供cache中high值得可配置,
這無疑提高了靈活性,方便對jvm進行優化。
參考long的原始碼:
privatelong也做了快取,只是沒有提供調整機制, 在short中類似:static
class
longcache
static
final long cache = new long[-(-128) + 127 + 1];
static
}
privatestatic
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不能夠互用,因為他們兩種不同的資料...