包装类本质是解决基本类型非对象与java面向对象特性的矛盾:一、泛型和集合要求对象,如list合法而list报错;二、方法参数需统一对象模型,如integer.parseint();三、用null表达“无值”,区别于int的默认值0。

Java包装类是面试高频考点,答得准、答得清,关键在三点:说清“为什么需要”,讲透“怎么用”,点明“容易踩坑的地方”。不用堆概念,直接按实际场景组织回答。
为什么要有包装类?三句话说清本质
基本类型不是对象,但Java是面向对象语言,很多地方必须用对象:
- 泛型和集合不能存基本类型,List
合法,List 编译报错 - 方法参数或返回值需要统一对象模型,比如 Integer.parseInt()、Arrays.sort(Object[])
- 需要表达“无值”语义,比如数据库字段为 NULL,Integer 可为 null,而 int 只能是 0
装箱和拆箱怎么运作?分清隐式和显式
装箱是基本类型 → 包装类对象,拆箱反之。Java 5 起支持自动(隐式)转换,但底层仍是方法调用:
- 隐式装箱:如 Integer i = 100; → 实际调用 Integer.valueOf(100)
- 隐式拆箱:如 int j = i; → 实际调用 i.intValue()
- 显式操作:手动调用 Integer.valueOf(42) 或 new Integer(42)(后者已不推荐),或调用 xxxValue() 方法
缓存机制与 == 判断陷阱
Integer 等包装类对小整数做了缓存(默认 -128 到 127),这直接影响对象比较结果:
- Integer a = 100, b = 100; → a == b 为 true(复用缓存对象)
- Integer c = 200, d = 200; → c == d 为 false(各自新建对象)
- 安全比较一律用 equals(),或先确保非 null 再用 Objects.equals(a, b)
包装类实例是否可变?一句话结论
所有标准包装类(Integer、Boolean、Double 等)都是不可变类。一旦创建,内部封装的值无法修改 —— 这是设计原则,也是线程安全的基础。试图“修改”只会产生新对象,比如 i++ 实质是 new Integer(i.intValue() + 1)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











