A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谢明 中级黑马   /  2012-3-19 17:17  /  2349 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

整数的自动装箱与拆箱是如何实现的呢
装箱应该是 Integer.valueOf(int number)
Integer a = Integer.valueOf(100); Integer b = 100; System.out.println(a == b) // true

Integer a = 156; Integer b = 156; System.out.println(a == b) //false
示例   帮我说明原因

4 个回复

倒序浏览
Integer b = 100等价于Integer b =new Integer(100);这是自动完成的。这叫自动装箱。
自动拆箱是自动调用的intValue()方法。
当数值在1个byte表示的范围之内时,对于Integer来说,如果这个数值存在,他就不会在开辟新的内存空间,如果超过了这个范围,他会开辟新的空间。
所以Integer a = Integer.valueOf(100); Integer b = 100; System.out.println(a == b) // true
Integer a = 156; Integer b = 156; System.out.println(a == b) //false
因为1个byte表示的范围是-128~127

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
integer在-128~128之间时他默认是int类型  是为了节约内存这之间的数值在内存中是在同一个位置所以结果是true,张老师的视频教程里说这叫享源模式 。
超过了他们在内存的位置是不一样 也就是两个不同的对象所以结果是false
回复 使用道具 举报
Integer a = 1; 自动装箱 是 Integer a =new Integer(1); 这就是自动装箱  
  而Integer a = 1; 是1.5的新特性,a是一个引用。右边的1其实应该看做是一个对象
  a = a+1   先把a自动拆箱  Integer.valueOf(a); 通过Integer类调用它自身的静态方法valueOf()
      把a引用换成a变量  也就是自动拆箱  然后int型a和1相加的和 在通过上面的
          自动装箱最后把对象的地址赋给等号左边的a引用
回复 使用道具 举报
你可以试试:
Integer i1 = 13;
Integer i2 = 13;
System.out.println(i1 == i2); 看看打印结果是什么?  结果返回的是true.
156怎么会返回false了呢?
原因是:对于基本数据类型的整数,要装箱成Integer对象的时候,如果这个数字在一个字节之内,也就是-128到127之间的数字,一旦被包装成Integer对象之后,就会把它缓存起来,在一个池里面。当下次又要把一个整数包装成Integer对象的时候,就会先要到缓存池里面看有没有这个数,如果有就从缓存池里面取,这样就节省了内存空间。
其实这是一种设计模式,叫享元模式。
所以13被缓存起来了,用的是同一个对象。所以返回的是true.而158返回的就是false,明白了吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马