- 自动装箱与拆箱:基本数据类型(byte、short、char、int、long、float、double、boolean)与其封装对象(Byte、Short、Character、Integer、Long、Float、Double、Boolean)的相互转换。比如将byte类型转换成Byte对象是装箱过程,反之是拆箱过程
- 原理:装箱过程调用valueOf方法,拆箱过程调用byteValue、shortValue、charValue、intValue、longValue、floatValue、doubleValue、booleanValue方法
public byte byteValue() {
return value;
}
public int intValue() {
return value;
}//另外的方法皆类似
- 目的:自动装箱与拆箱过程是JDK1.5引入的新特性,用以处理需要调用基本数据类型的封装对象的情况,如: 集合collection类只接受Integer类对象,而传入的参数却是int基本类型,所以需要我们手动封装int,即
Integer i = new Integer(2)
,再将i
传入。其出现的意义主要是简化代码。
- 自动装箱与拆箱只在赋值和调用方法的时候启动
- 注意==是操作符,当对基本数据类型比较其变量值,而对对象的比较比较其地址值,对基本数据类型和封装类型,会将封装类型自动拆箱后比较
例子
public class AutomaticBoxing2 {
public static void main(String[] args) {
int iNum1 = 16;
int iNum2 = 16;
Integer iNum3 = new Integer(16);
Integer iNum4 = new Integer(16);//没有发生自动装箱
Integer iNum5 = 16;
Integer iNum6 = 16;//自动装箱成 Integer类型
System.out.println((iNum1 == iNum2));//true 都是基本数据类型,存在在栈内存中,有缓存的情况下,基于享元模式,故为true
System.out.println((iNum1 == iNum3));//true Integer的iNum3自动拆箱后与iNum1比较
System.out.println((iNum1 == iNum5));//true iNum5自动拆箱后与iNum1比较
System.out.println((iNum3 == iNum4));//false 两个new出新的对象进行比较,是两个对象,故false
System.out.println((iNum3 == iNum5));//false iNum3是new出的新对象,而iNum5是在-128~127之间的缓存区对象
System.out.println((iNum5 == iNum6));//true 两个都是缓存区对象
}
}
- 注意:
- Double和Float类型没有缓存区
- 超出缓存区范围的会new新空间