必须用包装类:集合(list合法,list编译失败)、泛型(基本类型不继承object)、表达null语义(如数据库null字段)。行为上:默认值不同(int为0,integer为null)、==比较结果受缓存影响(-128~127内true,否则false)、null拆箱抛npe、存储位置不同(栈vs堆)、功能不同(integer有parseint等方法)。

面试时讲清楚基本类型和包装类,关键不是罗列定义,而是用对比逻辑带出“为什么需要它”。重点说三点:用途差异、行为差异、实际踩坑点。
用途上:什么时候必须用包装类?
基本类型高效但受限;包装类补足面向对象场景的硬需求:
- 集合容器(List
合法,List 编译报错) - 泛型参数(泛型擦除后只剩 Object,基本类型不继承 Object)
- 表达“缺失”语义(数据库字段可能为 NULL → 用 Integer 而非 int)
- POJO 字段需支持 null(如 private Integer status; 可为 null,int status 永远是 0)
行为上:五个典型区别要拎得清
不能只说“一个是值,一个是对象”,要对应到可验证的现象:
- 默认值不同:成员变量 int 默认 0,Integer 默认 null
- == 比较结果不同:Integer a = 127, b = 127 → a == b 为 true(缓存内);a = 128, b = 128 → a == b 为 false(新建对象);而 int 总是比值
- 空指针风险:Integer i = null; int j = i; 运行时报 NullPointerException(自动拆箱失败)
- 内存位置不同:int 局部变量在栈,Integer 对象在堆,栈中存引用
- 功能能力不同:Integer 提供 parseInt、toHexString、compareTo 等方法;int 什么方法都没有
实战提醒:别掉进缓存和装箱陷阱
高频被追问的细节,提前准备好解释:
- valueOf 缓存范围:Integer.valueOf(-128 ~ 127) 返回常量池对象;超出则 new 新对象 —— 这是 == 表现不一致的根源
- 避免用 == 比包装类:一律用 equals(),但注意 Integer.equals(null) 安全,而 null.equals(Integer) 报 NPE
- 循环中慎用自动装箱:for (int i = 0; i
- new Integer() 已过时:JDK 9+ 标记为 deprecated,必须用 valueOf 或直接赋值(自动装箱)
讲完这三块,再补一句收尾:“本质上,基本类型是 JVM 的效率基石,包装类是 Java 面向对象生态的必要桥梁——选哪个,看你要的是速度,还是灵活性。”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











