java不规则二维数组是“一维数组的数组”,每行独立分配、长度可不同甚至为null;处理核心是“先判空,再取长”,创建需分两步,遍历须严格校验null和长度。

Java 不规则二维数组不是“矩阵”,而是“一维数组的数组”——每行独立分配、长度可不同,甚至某行为 null。处理它的核心不是套用规则数组思维,而是始终围绕两个动作:**先判空,再取长**。漏掉任一环节,NullPointerException 或 ArrayIndexOutOfBoundsException 就会立刻出现。
创建必须分两步:先定行,再逐行赋列
不能用 new int[4][5] 一步到位,那会强制所有行长度为 5,失去“不规则”意义。
-
静态初始化:直接按行写,长度由花括号内元素个数决定
int[][] j = { {1}, {2, 3, 4}, {}, {5, 6, 7, 8} };
第 0 行长 1,第 1 行长 3,第 2 行是空数组(.length == 0),第 3 行长 4。 -
动态初始化:先声明外层数组,再对每一行单独
newString[][] data = new String[3][];data[0] = new String[2]; // 行 0:2 列data[1] = new String[0]; // 行 1:空数组data[2] = null; // 行 2:显式为 null,合法但危险
按行遍历:安全循环模板要背下来
传统双层 for 最可控,尤其需要索引或修改值时。关键逻辑嵌在条件里:
- 外层控制
i ,确保不越行 - 每进入内层前加
if (arr[i] != null),防止对null行调.length - 内层上限必须是
arr[i].length,绝不能用arr[0].length
标准写法:
for (int i = 0; i if (arr[i] != null) {<br> for (int j = 0; j System.out.print(arr[i][j] + " ");<br> }<br> }<br> System.out.println();<br>}
按列遍历:先找最大列数,再逐行校验
不规则数组没有统一列数,但可以定义“最大列数”作为列循环边界。这个值来自所有非空行长度的最大值:
- 先扫一遍外层数组:
maxCols = Math.max(maxCols, row != null ? row.length : 0); - 外层循环列索引
c从0到maxCols - 1 - 内层循环每行
r时,访问前必须同时检查:arr[r] != null && c
这样,第 0 列输出所有行的第 0 个有效元素,第 1 列输出所有行的第 1 个有效元素……跳过缺失位置,不报错也不填默认值。
典型实战场景与选型建议
不规则数组适合结构天然不齐的数据,但不是万能解:
-
杨辉三角、组合数表:第
n行有n+1个数,用int[n+1][]动态分配最自然 -
稀疏矩阵存储:若真以“省空间”为目标,别硬用不规则数组;改用
Map<integer map integer>></integer>或三元组列表更高效 - 班级成绩单:每个班人数不同,每行存一个班成绩,逻辑清晰且随机访问快
-
含空行或动态追加的表格:某行可能尚未填充,保持
null是合理状态,遍历时必须容忍
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











