Integer IntegerCache源码阅读
先看一段测试结果:
/*publicstaticvoidmain(String[]args){
Integera=128,b=128;
Integerc=127,d=127;
System.out.println(a==b);//false
System.out.println(c==d);//true
}*/
/*publicstaticvoidmain(String[]args){
Integerint1=Integer.valueOf("100");
Integerint2=Integer.valueOf("100");
System.out.println(int1==int2);//true
}*/
publicstaticvoidmain(String[]args){
Integerint1=Integer.valueOf("300");
Integerint2=Integer.valueOf("300");
System.out.println(int1==int2);//false
}
JDK的源码如下:
publicstaticIntegervalueOf(Strings)throwsNumberFormatException{
returnInteger.valueOf(parseInt(s,10));
}
publicstaticIntegervalueOf(inti){
if(i>=IntegerCache.low&&i<=IntegerCache.high)
returnIntegerCache.cache[i+(-IntegerCache.low)];
returnnewInteger(i);
}
发现里面另有玄机,多了个IntegerCache类:
privatestaticclassIntegerCache{
staticfinalintlow=-128;
staticfinalinthigh;
staticfinalIntegercache[];
static{
//highvaluemaybeconfiguredbyproperty
inth=127;
StringintegerCacheHighPropValue=
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if(integerCacheHighPropValue!=null){
try{
inti=parseInt(integerCacheHighPropValue);
i=Math.max(i,127);
//MaximumarraysizeisInteger.MAX_VALUE
h=Math.min(i,Integer.MAX_VALUE-(-low)-1);
}catch(NumberFormatExceptionnfe){
//Ifthepropertycannotbeparsedintoanint,ignoreit.
}
}
high=h;
cache=newInteger[(high-low)+1];
intj=low;
for(intk=0;k=127;
}
privateIntegerCache(){}
}
原来Integer把-128到127(可调)的整数都提前实例化了。
这就解释了答案,原来你不管创建多少个这个范围内的Integer用ValueOf出来的都是同一个对象。
但是为什么JDK要这么多此一举呢?我们仔细想想,淘宝的商品大多数都是100以内的价格,一天后台服务器会new多少个这个的Integer,用了IntegerCache,就减少了new的时间也就提升了效率。同时JDK还提供cache中high值得可配置,
这无疑提高了灵活性,方便对JVM进行优化。
总结
以上就是本文关于IntegerIntegerCache源码阅读的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!