java包装类使基本类型以对象形式参与面向对象操作,支持自动装箱与拆箱;八种对应包装类均不可变且位于java.lang包;需注意缓存范围、空指针、比较方式及性能问题。

Java包装类让基本数据类型能以对象形式参与面向对象操作,实现自动装箱(primitive → wrapper)和拆箱(wrapper → primitive),无需手动new或调用方法。
理解八种基本类型对应的包装类
每种基本类型都有唯一对应的不可变包装类:Byte、Short、Integer、Long、Float、Double、Character、Boolean。它们都位于java.lang包中,无需显式导入。
- int ↔ Integer(最常用,注意Integer常量池范围是-128~127)
- boolean ↔ Boolean(只有true和false两个实例,可安全用==比较)
- char ↔ Character(注意区分字符字面量'c'与字符串"c")
- 其余类似,命名规则为首字母大写
自动装箱与拆箱的典型场景
编译器在合适时机自动插入转换代码,常见于集合操作、泛型、方法参数传递等。
- 向ArrayList
添加int值: list.add(42)→ 自动转为list.add(Integer.valueOf(42)) - 从List取值赋给基本类型:
int x = list.get(0)→ 自动调用intValue() - 在表达式中混合使用:
Integer a = 100; int b = a + 5;→ 先拆箱再计算
手动转换的必要场合与注意事项
自动转换有局限,需手动干预时要避免空指针和精度丢失。
- 从String解析数值:用
Integer.parseInt("123")(返回int)或Integer.valueOf("123")(返回Integer) - 处理可能为null的包装类变量:先判空再拆箱,否则抛
NullPointerException - 比较两个Integer对象:建议用
.equals()而非==(除非确认在缓存范围内) - 浮点包装类慎用==:
Double d1 = 0.1 + 0.2; Double d2 = 0.3;,d1.equals(d2)仍为false
性能与内存使用的实际考量
频繁自动装箱可能影响性能,尤其在循环或大量数据场景下。
- 避免在循环中反复装箱:
for(int i=0; i比<code>list.add(Integer.valueOf(i))更优(JDK 5+已优化) - 大数值超出缓存范围时,每次装箱都新建对象,增加GC压力
- 集合存储基本类型需求高时,考虑使用第三方库如Eclipse Collections或原始类型特化集合
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











