首先看一下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包装类比较