基本类型值直接存栈中,包装类对象存堆中、栈存引用;基本类型有确定默认值(如int为0),包装类默认null;integer等在-128~127范围享缓存对象,超出则新建。

面试时被问到基本类型和包装类的存储区别,重点不是背概念,而是说清“在哪存、怎么存、为什么这么存”。下面分三块讲清楚:
栈 vs 堆:位置不同
基本类型(如 int、boolean)作为局部变量时,值直接存在栈内存里;而包装类(如 Integer、Boolean)是对象,实例一定分配在堆内存中,栈里只存指向它的引用。
- 例如:
int a = 5;→ 栈中直接存数字 5 - 例如:
Integer b = 5;→ 堆中新建一个 Integer 对象,栈中存的是这个对象的地址
默认值体现存储语义差异
成员变量场景下更能看出本质区别:
- 基本类型有确定默认值:int 默认 0,boolean 默认 false,char 默认 '\u0000'
- 包装类默认为 null:因为它是引用类型,未初始化就指向空,能明确表达“尚未赋值”或“数据库字段为 NULL”的语义
这点直接影响 POJO 设计——《阿里巴巴 Java 开发手册》强制要求 DTO/VO/DO 的数值字段用包装类型,避免因自动拆箱导致 NullPointerException。
缓存机制说明“堆中对象可复用”
虽然包装类对象在堆中,但并非每次装箱都新建:
-
Integer a = 127;和Integer b = 127;→a == b为 true(共享缓存池中的同一个对象) -
Integer c = 128;和Integer d = 128;→c == d为 false(超出 -128~127 范围,各自 new 出新对象)
这说明:堆中对象可以被缓存复用,但仍是堆分配;而基本类型永远无引用、无地址、无 null,只有值。
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











