黑马程序员技术交流社区
标题:
自动装箱与拆箱
[打印本页]
作者:
谢明
时间:
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