跳至主要內容

包装类

Yang大约 3 分钟JavaJava基础

  • 类型特点
    • 不允许被继承,没有子类
    • 包装类是引用类型,拥有方法和属性
    • 基本数据类型只包含数值信息
  • 存储方式
    • 包装类型对象实例化,借由 new 在堆空间进行空间分配,对应栈空间中存储地址引用
    • 基本数据类型变量对应栈空间中存储的是具体数据值
  • 初始值
    • 包装类的对象为初始化时,初始值均为 null
    • 基本数据类型有各自的默认初始值
基本类型默认值对应的包装类默认值
byte0Bytenull
short0Shortnull
int0Integernull
long0LLongnull
float0.0fFloatnull
double0.0dDoublenull
char' '(\u0000)(空格)Characternull
booleanfalseBooleannull

装箱

基本数据类型转换为包装类的过程

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 值

  • 装箱后如果用 == 比较对象的内存地址,除 DoubleFloat 外,如数据值在 -128 ~ 127 ,则相同;反之会重新生成对象,为不同

  • 调用 equals 方法时

    • 当类型相同,且数值相同时,返回 true,反之,返回 false
    • 当比对方为基本数据类型时,会先进行自动装箱操作,后进行比较

装、拆箱操作对比强制类型转换的不同

  • 装箱&拆箱多用于同类型基本数据类型和其对应包装类之间;强制转换多用于可兼容类型之间
  • 强制类型转换时不产生新的对象的,只有类型兼容性检查和安全性检查等性能消耗
上次编辑于:
贡献者: sunzhenyang