Java 中的基本数据类型和引用数据类型在内存中的存储是怎样的呢?
1. 基本数据类型(Primitive Types)
包含: byte, short, int, long, float, double, char, boolean
存储过程:
- 存储位置:栈(Stack)
- 变量的值直接存储在栈内存中
- 声明时直接分配固定大小的内存空间(大小由类型决定,如
int占 4 字节) - 栈内存由系统自动管理,方法执行完毕即释放
ini
栈内存:
┌─────────────┐
│ int a = 10 │ ← 直接存储值 10
├─────────────┤
│ double b=3.14│ ← 直接存储值 3.14
└─────────────┘
特点: 访问速度快、生命周期由作用域控制、赋值是值拷贝
2. 引用数据类型(Reference Types)
包含: 类(class)、接口(interface)、数组([])、枚举(enum)
存储过程(分两步):
- 栈(Stack): 存储引用变量(即对象的内存地址,类似指针)
- 堆(Heap): 存储对象的实际数据
ini
栈内存: 堆内存:
┌─────────────────┐ ┌──────────────────┐
│ Person p = 0x123│──地址指向──→ │ name = "张三" │
└─────────────────┘ │ age = 25 │
│ ... │
└──────────────────┘
赋值时的区别: 引用类型赋值传递的是地址,多个引用可指向同一对象
java
Person p1 = new Person("张三", 25);
Person p2 = p1; // p2 和 p1 指向同一个堆对象
p2.setName("李四"); // p1.getName() 也会变成 "李四"
3. 关键对比总结
| 对比维度 | 基本数据类型 | 引用数据类型 |
|---|---|---|
| 栈存储 | 存值本身 | 存地址(指针) |
| 堆存储 | 无 | 存实际对象数据 |
| 赋值行为 | 值拷贝(独立) | 地址拷贝(共享) |
| == 比较 | 比较值 | 比较地址(是否同一对象) |
| 默认值 | 有固定默认值(如 0, false) | null |
| 垃圾回收 | 方法结束自动释放 | GC 回收无引用的堆对象 |
一句话总结: 基本数据类型 "人就在栈里" ,引用数据类型 "栈里只是门牌号,人住在堆里"。