Java的自动装箱和拆箱

首先看一下Java基本类型与包装类的对应关系表:

基本数据类型 包 装 类
byte Byte
short Short
int Integer
long Long 
char Character
float Float
double Double
boolean Boolean

 自动装箱

将一个基本类型的变量直接赋值给对应的包装类变量,或者赋值给Object 变量(Object 是所有类的父类,子类对象可以直接赋值给父类变量)

/*
 * 自动装箱
 * */
//直接把一个基本类型变量给Integer对象
Integer inObj = 5;  //Integer i = Integer.valueOf(5);
//直接把一个Boolean类型 变量赋值给 一个 objcet类型的变量
Object boolObj = true;

自动拆箱

允许直接把包装类对象直接赋给一个对应的基本类型变量

Integer inObj = 5; 
Object boolObj = true;

/**
 * 自动拆箱
 */

int it = inObj;  //

if (boolObj instanceof Boolean) {
    //先把object 对象强制类型转换成 Boolean,在赋值给 boolean
    boolean b = (boolean) boolObj;
    System.out.println(b);
}

注意事项

  • 自动拆装箱要注意类型匹配,例如:Integer只能自动拆箱成 int ,不要试图拆成 boolean。int 只能自动装箱成Integer对象(即使赋值给Object类型变量,那也只是利用了Java的向上自动转型),简单说就是,你拿什么类型装的箱,拆的时候,就得拿什么类型去拆
  • 所有得装箱和拆箱过程都由系自动完成,无须程序员理会
  • 两个类型是否发生装箱或者拆箱,首先确定两个类型之间是否存在继承关系。如果存在,则有可能发生装箱或拆箱。

Java 的自动装箱拆箱机制是编译特性还是虚拟机运行时特性?

Java得自动装箱拆箱机制其实是编译时自动完成替换的,装箱阶段自动替换成为了valueOf方法,拆箱阶段自动替换为了xxxValue方法。

对于Integer 类型的 valueOf 方法参数如果是 -128~127 之间的值会之间返回内部缓存池中已经存在对象的引用,参数是其他范围值则返回新对象

Double 类与Integer类型类似,一样会调用 Double 的ValueOf方法,但是Double 的区别在于不管传入的参数值是多少都会 new 一个对象来表达该数值(因为在指定范围内浮点型数据个数不确定,整型的个数是确定的,所以可以cache)。

注意:

  • Integer,Short,Byte,Character,Long 的valueOf方法 实现类似,而Double和Float 比较特殊,每次返回新包装对象。

  • 对于两边都是包装类型的比较 == 比较的是引用,equals比较的是值。

  • 对于两边有一边是表达式(包含算数运算),则 == 比较的是数值(自动触发拆箱过程),对于包装类型 equals方法不会进行类型转换

有关Java包装类的比较,请看我的另一篇博客:Java包装类比较

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