基本数据类型不一定都存储在栈中,仅局部变量(方法内声明)才存于栈帧;成员变量、数组元素随对象存堆,静态常量存方法区。

基本数据类型在栈中存储,仅限于局部变量场景——不是“所有基本类型都存栈”,而是“在方法内定义的变量,值直接写进当前线程的栈帧里”。
局部变量:值直接落栈,按固定字节占位
只要是在方法、代码块或循环中声明的基本类型(如 int i = 42;、char c = 'x';),JVM 就会在该方法对应的栈帧中分配一块连续内存:
- int 占 4 字节 → 栈里写入 0x0000002A(十进制 42 的补码)
- double 占 8 字节 → 存 IEEE 754 双精度格式的二进制位
- boolean 实际按 1 字节处理(JVM 实现细节,不保证跨平台一致)
- 方法执行结束,整个栈帧弹出,这些值自动消失,不触发 GC
栈里存的是值本身,不是地址
和引用类型不同,基本类型变量在栈中不存指针、不存引用,它就是数值的二进制表示:
-
int a = 100;→ 栈中某位置直接存 100 的 4 字节编码 -
int b = a;→ 把这 4 字节完整复制一份到新位置,a 和 b 完全独立 - 修改 b 不会影响 a,因为它们是两份相同的值,不是指向同一处
注意:栈中没有“共享值”机制
有人误以为 int x = 5; int y = 5; 会共用一个 5,其实不会:
- x 和 y 各自占用独立的栈空间,哪怕值相同
- 这和 Integer 缓存(-128~127)完全不同——那是堆上的对象复用,与栈无关
- 栈里只有“分配→使用→释放”,没有缓存、没有池、不共享
别混淆:成员变量和数组元素不在栈里
容易误判的三种常见情况:
-
class A { int age; }→ age 是成员变量,随 new 出的对象一起存在堆中 -
int[] arr = new int[3];→ arr 引用在栈,但 arr[0]、arr[1]、arr[2] 这三个 int 值都在堆上的数组对象里 -
static final int VERSION = 1;→ 这个常量存在方法区(元空间),既不在栈也不在堆实例中
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











