我的日常

登录/注册
您现在的位置:论坛 资料库 JAVA开发 > java自动拆装箱自动转换原理
总共48086条微博

动态微博

查看: 2080|回复: 0

java自动拆装箱自动转换原理

[复制链接]

114

主题

29

听众

429

金钱

传功长老

该用户从未签到

跳转到指定楼层
楼主
发表于 2014-08-05 21:39:38 |只看该作者 |倒序浏览
一.概述

java允许把基本类型与其对应的包装器类型之间自动相互转换。

  • 自动装箱:Integer i=(int)100,int 类型的直接赋值给Integer类型;
  • 自动拆箱:int a=new Integer(100),Integer类型直接赋值给int类型
二.原理

自动拆装箱是由编译器完成的!我们写的代码,再由编译器“二次加工”,然后再编译成.class文件!

  • int a = new Integer(100);  编译器加工为:int a = new Integer(100).intValue();
  • Integer b = a;编译加工后为:  Integer b = Integer.valueOf(a);


三.误区
  1. int[] intArr = {1,2,3};  
  2. Integer[] integerArr = intArr;
复制代码
编译是无法通过,而且运行的时候会报这么一个错误


那么为什么编译的时候无法通过呢?
       原因是int[]是引用类型,而不是基本类型。而自动拆装箱只是在基本类型与其对应的包装器类型之间进行转换!也就是说,int[]和Integer[]是两种不同的引用类型。
四.一个小的题目题目:
  1. Integer i1 = 100;  
  2. Integer i2 = 100;  
  3. Integer i3 = 200;  
  4. Integer i4 = 200;  
  5.   
  6. System.out.println(i1 == i2);  
  7. System.out.println(i3 == i4);
复制代码

如果这道题给你做,你的答案会是什么?是两个true,还是两个false呢.两个true或者两个两个false都是错的.答案是true 和false.这个疑团要从编译器加工后的代码开始,我们先来看编译器加工过后的代码:
  1. Integer i1 = Integer.valueOf(100);  
  2. Integer i2 = Integer.valueOf(100);  
  3. Integer i3 = Integer.valueOf(200);  
  4. Integer i4 = Integer.valueOf(200);  
  5.   
  6. System.out.println(i1 == i2);  
  7. System.out.println(i3 == i4);
复制代码

除了看编译器加工后的代码,我们再看看Integer的一个方法:
  1. public static Integer valueOf(int i) {  
  2. final int offset = 128;  
  3. if (i >= -128 && i <= 127) { // must cache   
  4.     return IntegerCache.cache[i + offset];  
  5. }  
  6.        return new Integer(i);  
  7.    }  
复制代码

结合以上两个片段你应该可以看到,疑团在Integer.valueOf()方法身上。传递给这个方法100时,它返回的Integer对象是同一个对象,而传递给这个方法200时,返回的却是不同的对象。这是我们需要打开Integer的源码(这里就不粘贴Integer的源代码了),查看它的valueOf()方法内容。
       Integer类的内部缓存了-128~127之间的256个Integer对象,如果valueOf()方法需要把这个范围之内的整数转换成Integer对象时,valueOf()方法不会去new对象,而是从缓存中直接获取,这就会导致valueOf(100)两次,都是从缓存中获取的同一个Integer对象!如果valueOf()方法收到的参数不在缓存范围之内,那么valueOf()方法会new一个新对象!这就是为什么Integer.valueOf(200)两次返回的对象不同的原因了。其中Integer的取值范围是在学习VB的时候学习的.




科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表