Java二维数组行数为matrix.length,第i行列数为matrix[i].length;不规则数组需逐行检查null并动态获取长度,不可假设统一列数。

Java 二维数组的“长度”不是单一数值,而是分层结构:第一维长度表示行数(即有多少个一维数组),第二维长度需按行单独获取(每行可不同)。这种设计带来灵活性,也增加了逻辑维护的复杂度——关键在于明确区分“数组本身长度”和“每行元素个数”,并在扩展性操作中保持一致性。
如何准确获取二维数组的两个维度长度
二维数组本质是“一维数组的数组”,因此不能用 matrix.length 直接代表列数。正确方式如下:
- 行数:直接使用 matrix.length,它返回第一维数组中元素的个数(即有多少行);
- 第 i 行的列数:必须用 matrix[i].length,因为每行可能长度不同(锯齿数组);
- 统一列数假设需谨慎:只有当所有行长度一致时,matrix[0].length 才能代表“列数”,否则访问 matrix[0] 可能抛出 NullPointerException 或 ArrayIndexOutOfBoundsException(如首行为 null)。
创建不规则二维数组的三种实用方式
Java 支持各行长度不同的二维数组(Jagged Array),适用于树形结构、稀疏矩阵等场景。常用初始化方法包括:
- 先声明第一维,后逐行分配:int[][] arr = new int[4][]; 然后分别赋值 arr[0] = new int[2]; arr[1] = new int[5]; 等;
- 静态初始化嵌套花括号:int[][] arr = {{1,2}, {3,4,5,6}, {7}}; 编译器自动推导每行长度;
- 混合声明与初始化:int[][] arr; arr = new int[][]{{1},{2,3},{4,5,6}}; 适合运行时动态构造。
遍历与安全访问的关键习惯
避免硬编码列数或假设结构规整,推荐使用防御式遍历:
立即学习“Java免费学习笔记(深入)”;
- 外层循环用 i < matrix.length 控制行范围;
- 内层循环始终基于当前行判断:j < matrix[i].length,且在循环前检查 matrix[i] != null;
- 计算总元素数时,不能用 matrix.length * matrix[0].length,而应累加:sum += matrix[i].length;
- 对列方向聚合(如求每列和)时,需先确认所有非空行都至少有该列索引,否则跳过或补零。
扩容与逻辑扩展的现实约束
Java 数组大小不可变,二维数组扩容需重建结构:
- 若仅需增加行数:新建更大第一维的数组,复制原引用,再为新增行分配新一维数组;
- 若需延长某一行:只能替换该行引用,如 matrix[i] = Arrays.copyOf(matrix[i], newSize);
- 频繁增删建议改用 List<List<Integer>>,避免手动管理内存和长度逻辑;
- 任何扩容操作后,必须同步更新业务逻辑中对 matrix.length 和各 matrix[i].length 的依赖,否则易引发越界或空指针。


















