java基本类型局部变量存栈,成员变量随对象存堆;包装类对象存堆,引用变量存栈;==比较基本类型比值、引用类型比地址,内容比较用equals。

Java基础数据类型内存分配是面试中高频出现的考点,关键不在死记硬背字节数,而在于理解“类型特性 → 存储位置 → 行为表现”这条逻辑链。下面从三个实用角度帮你理清思路:
基本数据类型都存在栈里,但有例外
- 所有8种基本类型(
byte/short/int/long/float/double/char/boolean)的局部变量,直接存放在虚拟机栈的局部变量表中,速度快、生命周期随方法结束自动释放。 - 例外情况:如果基本类型作为对象的成员变量(如实例字段),那它就跟着对象一起存在堆里——比如
class A { int x = 10; }中的x,不是在栈,而是在堆中该对象的实例数据部分。 - 注意:
boolean虽然规范没规定具体占多少字节,但JVM底层通常用1字节或4字节(如单独使用时对齐需要),数组中则按1字节紧凑存储。
包装类和基本类型内存位置完全不同
-
Integer i = 100;这行代码背后:-
100是基本类型字面量,临时存在于栈; -
i是引用变量,本身存栈中,但它指向的是堆里的Integer对象(除非在-128 ~ 127缓存范围内,此时可能复用常量池中的对象);
-
-
int j = i;触发自动拆箱,从堆中取出值复制到栈,j是纯栈上变量,无引用、无GC压力。 - 所以:基本类型 = 值本身,包装类 = 引用 + 堆对象,混用时容易因
null或缓存机制引发空指针或==判断陷阱。
== 判断背后其实是内存位置在说话
-
int a = 5; int b = 5; System.out.println(a == b); // true—— 比的是栈里两个值是否相等; -
Integer c = 127; Integer d = 127; System.out.println(c == d); // true—— 因为缓存复用,c和d指向堆中同一个对象; -
Integer e = 128; Integer f = 128; System.out.println(e == f); // false—— 超出缓存范围,各自新建对象,地址不同; - 记住口诀:基本类型比值,引用类型比地址;想比内容,一律用
.equals()(且注意 null 安全)。
不复杂但容易忽略细节。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











