一维数组是单层对象结构,多维数组是多层引用嵌套结构;前者在堆中分配唯一连续对象,后者创建多个独立堆对象且内存不连续,访问需两次解引用。

Java 中一维数组和多维数组的内存分配核心区别在于:一维数组是**单层对象结构**,而多维数组是**多层引用嵌套结构**——后者本质是一维数组里存着其他数组的引用,各层均为独立堆对象。
一维数组:一块连续、单一的对象空间
声明如 int[] arr = new int[5]; 时:
- 在堆中分配**唯一一个对象**,包含对象头、length字段和5个连续的int值(共20字节);
- 栈中变量
arr直接持有该对象的地址; - 所有元素物理相邻,支持高效缓存访问和
System.arraycopy整体拷贝。
多维数组:外层数组 + 多个独立内层数组
声明如 int[][] matrix = new int[3][4]; 时:
- 堆中先创建一个长度为3的
int[]外层数组(每个元素初始为null); - 再为外层每个位置分别创建一个长度为4的
int[]对象——共4个独立堆对象(1个外层 + 3个内层); - 各内层数组内存不连续,甚至可能分散在不同内存页;
- 访问
matrix[1][2]需两次解引用:先查外层数组得内层地址,再按偏移取值。
不规则多维数组更凸显引用特性
像 int[][] jagged = new int[3][]; 后只分配外层数组;后续必须逐行初始化:
jagged[0] = new int[2];jagged[1] = new int[5];jagged[2] = new int[1];
此时三行长度不同、地址完全无关,彻底体现“数组的数组”语义。这种结构节省空间,但访问开销略高,且容易因某行未初始化导致 NullPointerException。
共同点与关键提醒
两者都分配在堆中,栈中仅存引用;数组本身是对象,有独立 hashCode 和 GC 生命周期。但多维数组需额外注意:
- 判空必须分两层:
if (matrix != null && matrix[i] != null); - 赋值
int[][] copy = matrix;是浅拷贝,修改会相互影响; - 大尺寸多维数组应及时置
null,助GC回收多个子对象。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











