Java数组是引用类型,变量存于栈中指向堆中的数组对象;堆中对象含对象头、length字段和元素区;多维数组为数组嵌套,各维独立分配堆内存;与基本类型直接存值不同,数组赋值仅复制引用。

Java 中的数组确实是引用数据类型,它的内存布局遵循 Java 的对象内存模型:数组本身是一个对象,存储在堆(Heap)中;而数组变量(即引用)存储在栈(Stack)中,指向堆中的数组对象。
数组变量(引用)存放在栈中
当你声明一个数组变量,例如:
int[] arr;
此时只在栈中分配一个引用变量 arr,它初始值为 null,不指向任何对象。
当执行初始化操作:
立即学习“Java免费学习笔记(深入)”;
arr = new int[5];
JVM 会在堆中创建一个长度为 5 的 int[] 对象,并把该对象的首地址赋给栈中的 arr。此后 arr 就是这个堆对象的“句柄”。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
数组对象本体位于堆中,包含元数据和元素区
堆中的数组对象由两部分组成:
-
对象头(Object Header):包含锁信息、GC 分代年龄、类型指针(指向 Class 对象,如
[I表示 int 数组类)等 JVM 内部管理字段 - 数组长度(length 字段):每个数组对象都隐含一个不可修改的 public final int length 字段,存储在对象数据区起始位置(紧挨对象头之后)
- 元素存储区(Element Data):紧跟 length 字段之后,连续存放实际元素。基本类型数组(如 int[])直接存数值;引用类型数组(如 String[])则存引用(即对象地址),元素本身仍在堆中
多维数组是“数组的数组”,逐层堆分配
Java 没有真正意义上的多维数组,而是通过数组嵌套实现。例如:
int[][] matrix = new int[3][4];
执行过程是:
- 先在堆中创建一个长度为 3 的 int[][] 对象(即“外层数组”)
- 该外层数组的每个元素都是 int[] 类型的引用,初始为 null
- 然后 JVM 为每个元素分别创建一个长度为 4 的 int[] 对象(共 3 个),并将它们的地址填入外层数组对应位置
因此,matrix[0]、matrix[1]、matrix[2] 各自指向**不同的堆内存块**,它们不要求连续,甚至长度可以不同(如 new int[3][] 后单独初始化每行)。
与基本类型变量的关键区别
对比 int x = 10;:
- x 是基本类型变量:值 10 直接存于栈中,无引用、无堆分配
-
int[] arr:栈中只存地址(如 0x7f8a...),真实数据(length + 5 个 int)在堆中;赋值
int[] b = arr;只复制地址,b 和 arr 指向同一堆对象 - 修改
arr[0] = 99或b[0] = 88都会影响对方看到的值,因为底层共享同一块堆内存

















