java多维数组本质是“数组的数组”,外层数组连续存储内层数组引用,各内层数组在堆中独立分配、物理地址不连续;支持不规则结构,访问时需两次解引用。

Java 多维数组不是一块连续内存,而是“数组的数组”——外层数组存的是内层数组的引用,各内层数组在堆中独立分配,彼此地址不连续。
二维数组实际是引用数组
声明 int[][] matrix = new int[3][] 时,只在堆中创建一个长度为 3 的引用型一维数组,每个元素初始为 null。后续必须分别初始化每一行:
-
matrix[0] = new int[4];→ 在堆中新开一段连续内存存 4 个 int -
matrix[1] = new int[2];→ 另起一块连续内存存 2 个 int -
matrix[2] = new int[5];→ 再开一块,长度为 5
这三块内存物理上互不相连,可能分散在堆的不同区域。
支持不规则结构(锯齿数组)
正因为每行单独分配,Java 多维数组天然支持不同长度的行:
int[][] jagged = {{1, 2}, {3, 4, 5, 6}, {7}};- 第一行占 2 个 int 空间,第二行占 4 个,第三行仅 1 个
- 访问
jagged[1][2]时,JVM 先通过外层数组找到第 1 个引用,再用该引用定位到对应子数组起始地址,最后按一维方式计算偏移
与 C/C++ 连续二维数组的本质区别
C 中 int arr[3][4] 是单一连续块(共 12 个 int),地址可直接用公式 base + (i * 4 + j) * 4 算出;Java 没有这种底层连续性:
- 外层数组本身是对象:含对象头、length 字段、数据区(存 3 个引用)
- 每个内层数组也是独立对象:各自有对象头、length、连续的数据区
- 所以
matrix[i][j]实际经历两次寻址:先查外层数组得引用,再查内层数组得值
三维及更高维同理
如 int[][][] cube,最外层数组元素是 int[][] 类型的引用,每个又指向一个二维数组对象,依此类推。每一层都是引用嵌套,没有跨维度的连续布局。
这种设计牺牲了部分缓存局部性,但换来了灵活性和运行时动态构造能力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











