先看一段測(cè)試結(jié)果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/ * public static void main(String[] args) { Integer c = 127 , d = 127 ; System.out.println(a = = b); / / false System.out.println(c = = d); / / true } * / / * public static void main(String[] args) { Integer int1 = Integer.valueOf( "100" ); Integer int2 = Integer.valueOf( "100" ); System.out.println(int1 = = int2); / / true } * / public static void main(String[] args) { Integer int1 = Integer.valueOf( "300" ); Integer int2 = Integer.valueOf( "300" ); System.out.println(int1 = = int2); / / false } |
JDK的源碼如下:
1
2
3
4
5
6
7
8
9
|
public static Integer valueOf(String s) throws NumberFormatException { return Integer.valueOf(parseInt(s, 10 )); } public static Integer valueOf( int i) { return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } |
發(fā)現(xiàn)里面另有玄機(jī),多了個(gè)IntegerCache類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
private static class IntegerCache { static final int low = - 128 ; static final int high; static final Integer cache[]; static { / / high value may be configured by property int h = 127 ; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty( "java.lang.Integer.IntegerCache.high" ); if (integerCacheHighPropValue ! = null) { try { int i = parseInt(integerCacheHighPropValue); i = Math. max (i, 127 ); / / Maximum array size is Integer.MAX_VALUE h = Math. min (i, Integer.MAX_VALUE - ( - low) - 1 ); } catch( NumberFormatException nfe) { / / If the property cannot be parsed into an int , ignore it. } } 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(可調(diào))的整數(shù)都提前實(shí)例化了。
這就解釋了答案,原來你不管創(chuàng)建多少個(gè)這個(gè)范圍內(nèi)的Integer用ValueOf出來的都是同一個(gè)對(duì)象。
但是為什么JDK要這么多此一舉呢? 我們仔細(xì)想想, 淘寶的商品大多數(shù)都是100以內(nèi)的價(jià)格, 一天后臺(tái)服務(wù)器會(huì)new多少個(gè)這個(gè)的Integer, 用了IntegerCache,就減少了new的時(shí)間也就提升了效率。同時(shí)JDK還提供cache中high值得可配置,
這無疑提高了靈活性,方便對(duì)JVM進(jìn)行優(yōu)化。
總結(jié)
以上就是本文關(guān)于Integer IntegerCache源碼閱讀的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
原文鏈接:http://www.cnblogs.com/mr-wuxiansheng/p/7498678.html