Integer類的快取機制

2021-10-24 23:55:17 字數 2033 閱讀 7283

檢視integer的原始碼,就會發現裡面有個靜態內部類。

該類的作用是將數值等於-128-127(預設)區間的integer例項快取到cache陣列中。通過valueof()方法很明顯發現,當再次建立值在-128-127區間的integer例項時,會復用快取中的例項,也就是直接指向快取中的integer例項。

(注意:這裡的建立不包括用new建立,new建立物件不會復用快取例項

public

static integer valueof

(int i)

private

static

class

integercache

high = h;

cache =

newinteger

[(high - low)+1

];int j = low;

//填充快取陣列

for(

int k =

0; k < cache.length; k++

) cache[k]

=new

integer

(j++);

}private

integercache()

}

實際上不僅僅integer具有快取機制,byte、short、long、character都具有快取機制。來看看long類中的快取類

private

static

class

longcache

static

final long cache=

newlong[-

(-128)

+127+1

];static

}

bytecache用於快取byte物件,shortcache用於快取short物件,longcache用於快取long物件,charactercache用於快取character物件。

這些類都有快取的範圍,其中byte,short,integer,long為 -128 到 127character範圍為 0 到 127

除了 integer 可以通過引數改變範圍外,其它的都不行

//情景1

integer c =

128;

integer d =

128;

system.out.

println

(c == d)

;//false

//情景2

integer a =1;

integer b =1;

system.out.

println

(a == b)

;//true。b.intvalue()

//情景3

integer e =

newinteger(1

);integer f =

newinteger(1

);system.out.

println

(e == f)

;//false

//情景4

int a =1;

integer b = integer.

valueof(1

);integer c =

newinteger(1

);system.out.

println

(a == b)

;//true

system.out.

println

(a == c)

;//true

a是基本型別,b和c是引用型別,兩者進行比較時有乙個拆箱的過程,也就是會預設呼叫b和c的intvalue()方法

Integer 中的快取類IntegerCache

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

Integer 中的快取類IntegerCache

2014年去某公司筆試的時候遇到這麼一道題 public class test 問列印的結果的多少?但是我回答的是false,後來仔細想想應該沒有這個簡單,就翻了下jdk的原始碼,發現 public static integer valueof string s throws numberforma...

Integer 的快取問題

integer 的快取 首先說的integer的快取問題。先列舉一下 我們發現,居然出現了不同的情況。當值為100的時候,兩個引用居然是相同的。當值為128的時候,兩個引用居然不相同了。這是什麼情況呢?要知道這個問題的原因,我們首先得了解一下integer這個包裝類的源 從這裡可以看出,intege...