java5 学习笔记4——Autoboxing

java5 学习笔记4——Autoboxing
 Java号称一切都是对象,除了primitive,也就是基本类型,这点估计让人很不爽,一开始你还没觉得有什么不妥,反正骨子里就认为基本类型就是int、float这些,在内存中就是占那么几个字节,别无他意。但是当你用collection时,比如要将一个整数放入ArrayList,你就会对“一切都是对象”抓狂了:一个int首先要包装成Integer,放入ArrayList<Integer>,取出时,再用intValue得到原来的整数值,够麻烦的,而Autoboxing就是用来为你做这个事情的。
 编译器在后台帮你把基本类型和他们相应的“包装类”之间的转换工作都做好了,所以现在基本上不用太多考虑int和Integer之间的转换了,两者在大部分情况下都可以互相赋值,除了一些特例,比如:
  Integer i = null;
  int j = i;
 这样会出现NullPointerException,所以要稍微留心。
 还有一个很搞笑的地方,就是==运算符。这是用来比较数值的,我们都知道。此外还能用来比较两个引用,看看是否指向同一个对象。那么下面的代码:
  Integer i =1000;
  Integer j = 1000;
  System.out.println(i==j);
 那么输出是什么?答案是false,可见AutoUnboxing没有处理==,也很好解释,因为在以前的Java中,这段代码就是比较两个引用,如果对它Unboxing,那么过去的代码放到tiger中编译就乱套了。
 仅此而已?当然不是,如果把上面的1000换成100,输出居然就变成true了,原因是tiger会把Boolean和-128~128的Integer以及short缓存,这时候两个Integer都是指向同一个对象(在内存中缓存的,值为100的Integer),奇怪吧,感觉Java越做越复杂,越做越古怪。
 总结:
 Autoboxing好吗?比起以前的Java,是一种进步,不过Java的primitive本来就很丑陋,虽然看起来符合C++人群的胃口。实际上,Java当初设计目的之一也是尽量吸引C++社群,所以才会出现这种“非完全面向对象”的尴尬,在当时是必要的,但现在已经成为Java发展的一大羁绊了
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值