自动装箱和拆箱

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 解释




你可能感兴趣的:(自动装箱和拆箱)