Java多维数组本质是数组的数组,需先创建外层数组容器,再循环逐行独立new内层数组以支持不规则形状;如上三角阵第i行含i+1个元素,必须分两步分配。

Java多维数组不能像C那样用单次malloc分配连续块,它的“多维”本质是**数组的数组**。所谓“通过循环分配内存”,实际是指对不规则(非矩形)二维数组进行**逐行独立创建**——即先建外层数组,再用循环为每一行单独 new 内层数组。
为什么需要循环分配?
当各行长度不同时(比如三角阵、稀疏结构),无法用 new int[3][5] 这种固定尺寸方式初始化。必须分两步:先声明外层数组容器,再按需为每行分配不同大小的内层数组。
标准循环分配写法(以二维为例)
以下代码创建一个“上三角”二维数组:第0行1个元素,第1行2个,……第n-1行n个元素:
// 声明外层数组(只分配引用容器空间)
int[][] triangle = new int[5][];
// 循环为每行分配具体长度的内层数组
for (int i = 0; i triangle[i] = new int[i + 1];
}
立即学习“Java免费学习笔记(深入)”;
此时:
• triangle 是长度为5的一维引用数组;
• triangle[0] 指向长度为1的 int[];
• triangle[4] 指向长度为5的 int[];
• 各行内存彼此独立,不要求地址连续。
常见错误与注意事项
- 不能跳过外层数组声明直接循环赋值——
int[][] arr;未初始化就arr[i] = ...会报NullPointerException - 循环中若某行未分配(如漏掉
arr[i] = new int[...]),该位置仍为null,访问时触发空指针异常 - 基本类型数组元素自动初始化为默认值(
int→0,boolean→false),无需额外循环赋初值 - 若需初始化为特定值,可在分配后嵌套循环填充:
for (int j = 0; j
扩展:三维及更高维的循环分配逻辑
三维可理解为“数组的数组的数组”。例如动态创建不规则三维结构:
int[][][] cube = new int[2][][];
for (int i = 0; i cube[i] = new int[3][];
for (int j = 0; j cube[i][j] = new int[j + 1]; // 每层“面”的行长度递增
}
}
核心规律不变:从最高维开始,逐层用循环创建下一级数组引用,直到最后一维才真正分配数据存储空间。


















