Java包装器与装箱 拆箱

Java中,所有基本类型都有一个与之对应的类。像int类型与Integer类对应,double与Double对应,这些类被称为包装器(wrapper)。Java中有8种基本类型,9个包装器:Intger、Long、Short、Byte、Double、Float、Character、Boolean、Void。

前6个类都派生于一个超类Number。

包装器不可变,当构造好了包装器,就不能更改在其中的值。并且包装器类是final类。

1.装箱:自动将基本数据类型转换为对应包装器对象

没有装箱时,若要生成一个数值为5的Integer对象,可以这样: Integer a=new Integer(5);

有了装箱,就可以简化:Integer a=5;//Integer a=Integer.valueOf(5);

2.拆箱:自动将包装器对象转换为基本数据类型

Integer a=new Integer(5);

int b=a;//自动将Integer类对象变成int类数据类型,再付给int类变量b

若无拆箱,则:

Integer a=new Integer(5);

int b=a.intValue();//intValue以int的形式返回Integer对象的值


3.那么问腿就来了,有人会遇到以下问题

例一:

Integer a = new Integer(100);  
Integer b = 100;  
System.out.println(a == b); 

答案是false

例二:

Integer a = 100;  
Integer b = 100;  
System.out.println(a == b);  

答案是true

例三:

Integer a = 156;  
Integer b = 156;  
System.out.println(a == b); 

答案是false。  

例四:

Integer a = Integer.valueOf(100);  
Integer b = 100;  
System.out.println(a == b);

答案是true

为什么这样?

从第一个说起,a为Integer类对象,而b为一个数据类型

第二个,二者皆为数据类型

第三个,由于是valueof()来实现的,看看valueof的代码

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

我们发现low为-128,而high为127,很明显,它不在区间以内

第四个,可以通过以上解释得出,两次valueof后返回了同一个对象

猜你喜欢

转载自blog.csdn.net/Billy1900/article/details/80600259