1. 装箱
- 装箱:基本类型-->引用数据类型
int num = 20; Integer number = num; // 自动装箱
上面最后一条语句相当于:Integer number = new Integer(num);
- 但是问题来了。
-
Double d1=1.0; Double d2=new Double(1.0);
Double d2 = new Double(d1) 和 Integer number = new Integer(num);是一个概念吗?
- Integer包装类实现了常量池技术,因此num的20是从常量池中获取的
- Double没有实现常量池技术,不再从常量池寻找数据,而是从堆中各自new一个对象。也就是说1.0在堆中,没有在常量池中。
2. 拆箱
- 拆箱:引用数据类型-->基本类型
Integer number = new Integer(18); int num = number; // 自动拆箱
上面最后一条语句相当于:int num = number.intValue();
3. 例1
3.1 代码
package com.ilaoda.day0905; /** * 自动装箱 拆箱 * @author Administrator * */ public class Test3 { public static void main(String[] args) { Integer in1 = new Integer(100); Integer in2 = new Integer(100); Integer in3 = 100; Integer in4 = 100; System.out.println("in1 == in2:" + (in1 == in2)); //false System.out.println("in1 == in3:" + (in1 == in3)); //false System.out.println("in3 == in4:" + (in3 == in4)); //true 自动装箱,取值在byte范围内,所以指向同一块区域 /** * 为何和上面的in3、int4的比较一样为true。可是in5 == in6会出现false呢? */ Integer in5 = 128; Integer in6 = 128; System.out.println("in5 == in6:" + (in5 == in6)); //false } }
3.2 答案
in1 == in2: false in1 == in3: false in3 == in4: true in5 == in6: false
3.3 解释
这里有个小细节必须注意:
对于自动装箱的操作,如果在赋值时,取值在byte范围内,也就是-128~127,他们指向同一块堆空间区域。如果超出byte的范围,那么就各自创建自己的对象,即重新new出来的一块空间。
4. 例2
4.1 代码
package com.ilaoda.day0905; public class Test4 { public static void main(String[] args) { objPoolTest(); } public static void objPoolTest() { int i = 40; int i0 = 40; Integer i1 = 40; Integer i2 = 40; Integer i3 = 0; Integer i4 = new Integer(40); Integer i5 = new Integer(40); Integer i6 = new Integer(0); Double d1=1.0; Double d2=1.0; System.out.println("i=i0: " + (i == i0)); System.out.println("i1=i2: " + (i1 == i2)); System.out.println("i1=i2+i3: " + (i1 == i2 + i3)); System.out.println("i4=i5: " + (i4 == i5)); System.out.println("i4=i5+i6: " + (i4 == i5 + i6)); System.out.println("d1=d2: " + (d1==d2)); System.out.println(); } }
4.2 答案
i=i0: true i1=i2: true i1=i2+i3: true i4=i5: false i4=i5+i6: true d1=d2: false
4.3 解释
时间: 2024-12-21 20:17:48