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后返回了同一个对象