自动装箱与拆箱

  • 自动装箱与拆箱:基本数据类型(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新空间

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