Integer的自动拆箱和装箱到底是怎么回事

1,173 阅读3分钟

1.拆箱和装箱

1.1常见考点
 //自动装箱
 Integer total = 99;
 //自定拆箱
 int totalprim = total;

简单一点说,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。

Integer是基本数据类型的int的引用类型,官方语言叫做装箱类型,

在对Integer进行==比较的时候如果这个数在-128到127之间,他是在缓存中,但是如果超过了这个范围,那就会new出一个新对象,这时候在比较就是false

下面以例子来说明:

@Test
    public void testEquals() {
        int int1 = 12;
        int int2 = 12;
        
        Integer integer1 = new Integer(12);
        Integer integer2 = new Integer(12);
        Integer integer3 = new Integer(127);
        
        Integer a1 = 127; //或者写成Integer a1 = Integer.valueOf(127);
        Integer a2 = 127;//或者写成Integer a2 = Integer.valueOf(127);
        
        Integer a = 128;
        Integer b = 128;
            
        System.out.println("int1 == int2 -> " + (int1 == int2));                    
        System.out.println("int1 == integer1 -> " + (int1 == integer1));            
        System.out.println("integer1 == integer2 -> " + (integer1 == integer2));    
        System.out.println("integer3 == a1 -> " + (integer3 == a1));                
        System.out.println("a1 == a2 -> " + (a1 == a2));                            
        System.out.println("a == b -> " + (a == b));                                                    
    }   

答案是:
1、   int1 == int2 -> true
2、   int1 == integer1 -> true
3、   integer1 == integer2 -> false
4、   integer3 == a1 -> false
5、   a1 == a2 -> true
6、   a == b -> false

nt到Integer:

int a=66; Integer A=new Integer(a);

或: Integer A=Integer.valueOf(a);

Integer到int:

Integer A=new Integer(66);

int a=A.intValue();

在比较 int和Integer的时候常用==或者equers()

对于==

==比较基本数据类型==,如果两个值相同,则结果为true ==而在比较引用时==,如果引用指向内存中的同一对象,结果为true

1.int1 == int2为true,==比较的值==

2.int1 == integer1,Integer是int的封装类,当Integer与int进行双等于比较时,Integer就会拆箱成一个int类型,所以还是相当于两个int类型进行比较,这里的Integer,不管是直接赋值,还是new创建的对象,只要跟int比较就会拆箱为int类型,所以就是相等的。(简单来说就是Integer自动拆箱为int,然后双等于就是==比较的值==)

3.integer1 == integer2 -> false,这是两个都是对象类型,而且不会进行拆箱比较,所以是在==比较地址==所以不等

4、integer3 == a1 -> false , integer3是一个对象类型,而a1是一个常量它们存放内存的位置不一样,所以也不等,==比较的地址==,常量和变量。

5.Integer作为常量时,对于-128到127之间的数是存在缓冲中,也就是说int a1=127时,在这个访问之类,这个时候就存在缓冲中,当在创建a2时,发现缓存存在这个数,就直接取出来赋值给a2所以就相等了,(对于5)==比较的地址==,但是==指向的都是缓存中的地址==,当范围超过了这个界限,那么就会new出一个新的对象,(对于6)所以对于a和b就是==比较地址==,但是是==对两个不同的对象==

1.2总结

对于==比较而言,针对int就是比较值,针对装箱类型(引用类型)比较的就是地址 但是如果这个引用类型在-128到127之间就存在缓存中,比较的时候就是同一个对象(同一个地址)超过这个范围就会重新创建对象就是比较的两个对象(两个地址)对于int和Integer比较,java会自动拆箱,所以到最后还是比较的值。