java不规则二维数组本质是一维引用数组,每行需单独new且内存独立;外层数组仅存null引用,遍历时须判空并动态获取每行长度。

Java 不规则二维数组(又称锯齿数组)的构建不是“一次分配”,而是分步、显式、手动控制内存的过程——它本质是一维引用数组,每个元素指向独立的一维数组,各行长度可不同,内存彼此隔离。
外层数组先建容器,不分配实际数据
执行 int[][] arr = new int[5][]; 时:
- 仅在堆中分配一块连续空间,容纳 5 个
null引用(类型为int[]) - 此时
arr.length == 5,但arr[0]到arr[4]全为null - 栈中只存变量
arr,它指向这块引用数组的首地址 - 没有任何
int值被创建,也没有子数组内存被占用
每行需单独 new,内存独立且不连续
必须逐行赋值,例如:
-
arr[0] = new int[3];→ 在堆中新开一段连续内存,存 3 个0 -
arr[1] = new int[7];→ 另起一块连续内存,与上一行地址无关 -
arr[2] = new int[0];→ 创建空数组(合法,.length == 0,非null) -
arr[3] = null;→ 显式留空,后续访问需判空
所有子数组互不影响,删除某行(如 arr[1] = null)只释放其对应内存块,不波及其他行。
遍历时必须先判空,再取长度
不能假设所有行都存在或长度一致。安全写法是:
- 外层循环:用
i 控制行范围 - 进入内层前:加
if (arr[i] != null) - 内层循环:用
j ,而非固定值或 <code>arr[0].length - 避免直接调用
Arrays.toString(arr[i]),遇到null会立即抛异常
别用 new int[3][4] 伪装不规则结构
new int[3][4] 是语法糖,等价于自动为每行执行 new int[4] —— 它生成的是固定列数的规则数组。
- 后续写
arr[0] = new int[6]只是替换引用,原int[4]对象被丢弃 - 这不会让数组“变不规则”,只是某行引用被更新,其余行仍为长度 4
- 真要不规则,就必须从
new int[行数][]开始,再手动逐行new
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











