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发展的一大羁绊了
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发展的一大羁绊了