`
t225com
  • 浏览: 660476 次
文章分类
社区版块
存档分类
最新评论

装箱和拆箱和ValueOf以及XXXValue -- Java语法糖(Syntax sugar)

 
阅读更多

自动装箱拆箱发生在基本类型和其包装型互操作的时候。

以前一直不知的拆箱和装箱是valueOf和xxValue的别名。是语法糖的一种

Java代码 收藏代码
  1. publicstaticvoidmain(String[]args){
  2. Integeri=10;
  3. Integerj=10;
  4. System.out.println(j==i);//(1)true
  5. i=10000;
  6. j=10000;
  7. System.out.println(j==i);//(2)false
  8. i=newInteger(10000);
  9. System.out.println(i==10000);//(3)true
  10. System.out.println(10000==i);//(4)true
  11. System.out.println(i==10000L);//(5)true
  12. }

(1)处的结果是 true。

(2)处的结果是false。

(3)处的结果是true,true,true

(1),(2)处的结果不同让人惊讶。i = 10;和i=10000;发生了自动装箱,编译器自动编译成 Integer.valueOf(10)和Integer.valueOf(10000)。看看这个方法的实现。

Java代码 收藏代码
  1. publicstaticIntegervalueOf(inti){
  2. if(i>=-128&&i<=IntegerCache.high)
  3. returnIntegerCache.cache[i+128];
  4. else
  5. returnnewInteger(i);
  6. }

看到某些Integer对象是有缓存的,范围是-128,到high。

再看看IntegerCachestatic final int high;

Java代码 收藏代码
  1. staticfinalIntegercache[];
  2. static{
  3. finalintlow=-128;
  4. //highvaluemaybeconfiguredbyproperty
  5. inth=127;
  6. if(integerCacheHighPropValue!=null){
  7. //UseLong.decodeheretoavoidinvokingmethodsthat
  8. //requireInteger'sautoboxingcachetobeinitialized
  9. inti=Long.decode(integerCacheHighPropValue).intValue();
  10. i=Math.max(i,127);
  11. //MaximumarraysizeisInteger.MAX_VALUE
  12. h=Math.min(i,Integer.MAX_VALUE--low);
  13. }
  14. high=h;
  15. cache=newInteger[(high-low)+1];
  16. intj=low;
  17. for(intk=0;k<cache.length;k++)
  18. cache[k]=newInteger(j++);
  19. }

high默认是127,可以通过integerCacheHighPropValue

调整,看看这个属性的说明

Java代码 收藏代码
  1. /**
  2. *Cachetosupporttheobjectidentitysemanticsofautoboxingforvaluesbetween
  3. *-128and127(inclusive)asrequiredbyJLS.
  4. *
  5. *Thecacheisinitializedonfirstusage.DuringVMinitializationthe
  6. *getAndRemoveCachePropertiesmethodmaybeusedtogetandremoveanysystem
  7. *properitesthatconfigurethecachesize.Atthistime,thesizeofthe
  8. *cachemaybecontrolledbythevmoption-XX:AutoBoxCacheMax=<size>.
  9. */
  10. //valueofjava.lang.Integer.IntegerCache.highproperty(obtainedduringVMinit)
  11. privatestaticStringintegerCacheHighPropValue;

可以通过该参数调整缓存的范围 -XX:AutoBoxCacheMax=<size>

3,4,5处发生拆箱,编译之后其实调用了intValue,或者longValue。获得的是基本类型。

总结: 两个包装类型的值比较,最好不要用 ==


http://jilen.iteye.com/blog/1189353


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics