檢視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 到 127,character範圍為 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...