java包装类与基本类型的核心区别在于:包装类可为null、支持泛型和集合、具备对象方法,适用于需表达空值或面向对象场景;基本类型性能高、默认有值、用于数值计算。

Java 包装类和基本类型不是“能不能用”的问题,而是“在什么场景下该用哪个”的问题。面试官问这个,核心是看你是否理解设计背后的取舍:性能 vs 对象能力、值语义 vs 引用语义、确定性 vs 空状态表达。
能不能为 null 是最常考的业务区分点
基本类型永远有默认值(int 是 0,boolean 是 false),它代表“有值但就是这个数”;包装类默认是 null,代表“还没赋值”“未知”“不适用”。比如数据库字段允许为空,映射到 Java 实体类时,用 Integer 而不是 int,否则读到 null 会直接报 NullPointerException。
- 方法返回值需要表达“查不到”时,返回 Integer 而非 int(比如 findById())
- DTO 或 API 请求参数中,某个数值字段可选,必须用包装类接收
- Map 的 value 类型若可能为空,如 Map
,不能用 int
能不能进集合和泛型是硬性限制
Java 集合(ArrayList、HashMap 等)和泛型系统只接受引用类型。List
- 数组可以存基本类型(int[]),但 ArrayList 只能存 Integer
- 泛型擦除后实际操作的是 Object,基本类型无法向上转型,包装类可以
- Stream 操作如 mapToInt() 是特例,底层仍靠拆箱,但源头数据源仍是包装类集合
== 和 equals 的陷阱得讲清楚原理
基本类型用 == 比较数值,没问题;包装类用 == 比较的是对象地址——除非它们来自缓存池(如 Integer -128~127),否则即使值相同也返回 false。
- Integer a = 100, b = 100 → a == b 是 true(缓存命中)
- Integer c = 200, d = 200 → c == d 是 false(堆中新对象)
- 一律用 equals() 才安全;Boolean.TRUE == Boolean.TRUE 总是 true(内部是静态常量)
自动装箱/拆箱不是免费的,得知道它背后干了什么
Integer i = 100; 不是魔法,编译后变成 Integer i = Integer.valueOf(100);;int j = i; 编译后是 int j = i.intValue();。这意味着:
- 频繁装箱(如循环里 new Integer(i))会创建大量临时对象,触发 GC
- 拆箱遇到 null 会抛 NullPointerException(比如 Integer x = null; int y = x;)
- valueOf() 的缓存范围可配置(-XX:AutoBoxCacheMax=200),但默认仅 -128~127
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











