介绍
Java 中的包装类(Wrapper Class)是为了将基本数据类型转换为对象而存在的。在 Java 中,8个基本数据类型都有对应的包装类。分别为: 分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean 。
包装类型与基本类型的区别
包装类型可用于泛型,而基本类型不可以。
基本数据类型的局部变量存放在 Java 虚拟机栈中的局部变量表中,基本数据类型的成员变量(未被 static 修饰 )存放在 Java 虚拟机的堆中。包装类型属于对象类型,几乎所有对象实例都存在于堆中。
成员变量包装类型无默认值,初始化为null ,而基本类型有默认值且不是 null。
基本数据类型使用==比较的是值,而对于包装数据类型来说,比较的是对象的内存地址。故不能直接使用==比较两个包装对象的值,而是使用equals方法。
缓存机制
Java 包装类缓存机制指的是,在某些情况下,Java 会对一定范围内的包装类对象进行缓存,以提高性能和节省内存空间。
有缓存的包装类:
Byte,Short,Long,[-128, 127] 被缓存
Integer:默认缓存 [-128, 127](可通过参数扩大上界)
Character,[0,127]被缓存
Boolean:只缓存两个对象 TRUE 和 FALSE
Float、Double 没有实现这种缓存机制。
这些包装类一般在使用 valueOf(...) 或自动装箱时触发缓存逻辑:如果值在缓存范围内,直接返回缓存数组中的同一个对象引用。如果超出范围,则 new 一个新对象。
缓存的作用
减少频繁创建相同小整数、常用字符、布尔值对象的开销。提升性能、节省内存,是典型的“用空间换时间”的优化。
装箱,拆箱介绍
装箱/拆箱是基本类型和包装类型之间的相互转换机制,用来在“值类型”和“对象”之间搭桥
装箱会创建对象、拆箱会调用方法,两者都会带来额外的时间和内存开销,在高频场景(尤其是循环中)要尽量避免不必要的装箱拆箱
最后强调
所有整型包装类对象之间值的比较,全部使用 equals 方法比较。