黑马程序员技术交流社区

标题: 自动装箱与拆箱 [打印本页]

作者: 谢明    时间: 2012-3-19 17:17
标题: 自动装箱与拆箱
整数的自动装箱与拆箱是如何实现的呢
装箱应该是 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
示例   帮我说明原因
作者: 李爱军    时间: 2012-3-19 17:29
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
作者: 李成    时间: 2012-3-19 17:48
integer在-128~128之间时他默认是int类型  是为了节约内存这之间的数值在内存中是在同一个位置所以结果是true,张老师的视频教程里说这叫享源模式 。
超过了他们在内存的位置是不一样 也就是两个不同的对象所以结果是false
作者: 贠(yun)靖    时间: 2012-3-19 20:04
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引用
作者: 黑马张健    时间: 2012-3-21 00:12
你可以试试:
Integer i1 = 13;
Integer i2 = 13;
System.out.println(i1 == i2); 看看打印结果是什么?  结果返回的是true.
156怎么会返回false了呢?
原因是:对于基本数据类型的整数,要装箱成Integer对象的时候,如果这个数字在一个字节之内,也就是-128到127之间的数字,一旦被包装成Integer对象之后,就会把它缓存起来,在一个池里面。当下次又要把一个整数包装成Integer对象的时候,就会先要到缓存池里面看有没有这个数,如果有就从缓存池里面取,这样就节省了内存空间。
其实这是一种设计模式,叫享元模式。
所以13被缓存起来了,用的是同一个对象。所以返回的是true.而158返回的就是false,明白了吗?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2