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源码阅读的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!