包装类
大约 3 分钟
- 类型特点
- 不允许被继承,没有子类
- 包装类是引用类型,拥有方法和属性
- 基本数据类型只包含数值信息
- 存储方式
- 包装类型对象实例化,借由
new
在堆空间进行空间分配,对应栈空间中存储地址引用 - 基本数据类型变量对应栈空间中存储的是具体数据值
- 包装类型对象实例化,借由
- 初始值
- 包装类的对象为初始化时,初始值均为
null
- 基本数据类型有各自的默认初始值
- 包装类的对象为初始化时,初始值均为
基本类型 | 默认值 | 对应的包装类 | 默认值 |
---|---|---|---|
byte | 0 | Byte | null |
short | 0 | Short | null |
int | 0 | Integer | null |
long | 0L | Long | null |
float | 0.0f | Float | null |
double | 0.0d | Double | null |
char | ' '(\u0000 )(空格) | Character | null |
boolean | false | Boolean | null |
装箱
基本数据类型转换为包装类的过程
int t1 = 1;
// 1. 自动装箱:把一个基本类型变量直接赋给对应包装类型变量
Integer t2 = t1;
// 2. 手动装箱:可以结合类型的构造方法或 valueOf() 方法实现
Integer t3 = new Integer(t1);
拆箱
包装类转换为基本数据类型的过程
Integer t1 = 1;
// 1. 自动拆箱:包装类对象直接赋给对应的基本数据类型变量
int t2 = t1;
// 2. 手动拆箱:通过 xxxValue() 方法实现
int t3 = t1.intValue();
应用
- 当进行赋值操作时,会触发拆箱操作
- 当方法调用,传入参数时,也会触发相关操作
- 当结合操作符进行运算操作的时候,也会触发相关操作
// 通过包装类的 toString() 方法,将基本数据类型转换为字符串
int t1 = 2;
String t2 = Integer.toString(t1);
// 通过包装类的 parse 方法,将字符串转换为基本数据类型
int t3 = Integer.parseInt(t2);
// 先通过 valueOf() 方法将字符串转换为包装类,在通过自动拆箱转换为基本数据类型
int t4 = Integer.valueOf(t2);
支持缓存的包装类
Java 在集中包装类中提供了缓存设计,会对一定范围内的数据做缓存
如果数据在范围内,会优先从缓存中取数据,超出范围才会创建新对象
Byte 、Short、Integer、Long
:缓存[-128, 127]
区间的数据Character
:缓存[0, 127]
区间的数据Boolean
:缓存true、false
Double、Float
:不支持
包装类的比较
拆箱后的数据是基础数据类型,用
==
判断相等性,比较的都是数值,如果是字符,比较的是 ASCLL 值装箱后如果用
==
比较对象的内存地址,除Double
、Float
外,如数据值在-128 ~ 127
,则相同;反之会重新生成对象,为不同调用
equals
方法时- 当类型相同,且数值相同时,返回
true
,反之,返回false
- 当比对方为基本数据类型时,会先进行自动装箱操作,后进行比较
- 当类型相同,且数值相同时,返回
装、拆箱操作对比强制类型转换的不同
- 装箱&拆箱多用于同类型基本数据类型和其对应包装类之间;强制转换多用于可兼容类型之间
- 强制类型转换时不产生新的对象的,只有类型兼容性检查和安全性检查等性能消耗