关闭

java5 学习笔记4——Autoboxing

标签: javaintegerprimitivec++编译器float
921人阅读 评论(0) 收藏 举报
分类:
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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:484965次
    • 积分:5592
    • 等级:
    • 排名:第4692名
    • 原创:89篇
    • 转载:6篇
    • 译文:11篇
    • 评论:251条
    最新评论
    CSDN好友