一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Java不规则二维数组的创建与遍历实战手册

时间:2026-06-18 08:28:52 编辑:袖梨 来源:一聚教程网

Java不规则二维数组是“一维数组的数组”,每行长度可不同甚至为null;正确创建需外层分配行数、内层逐行分配列数;遍历时必须先判空再取长,否则易触发NullPointerException或ArrayIndexOutOfBoundsException。

Java不规则二维数组(又称“锯齿数组”)不是固定行列的矩阵,而是“一维数组的数组”,每行长度可不同,甚至某行为 null。创建和遍历时若按规则数组逻辑硬套,极易触发 NullPointerExceptionArrayIndexOutOfBoundsException。核心原则就一条:**每次访问子数组前,必须先判空;每次取长度或下标前,必须确认该行存在且足够长。**

如何正确创建不规则二维数组

创建方式灵活,关键在明确“外层分配行数、内层逐行分配列数”:

  • 静态初始化:直接用花括号定义各行,长度由元素个数自动决定
    int[][] jagged = { {1, 2, 3}, {4, 5}, {}, {6, 7, 8, 9} };
    第三行为空数组(length == 0),第四行长度为 4。
  • 动态初始化:先声明外层数组,再逐行 new 子数组
    String[][] users = new String[3][];
    users[0] = new String[2]; // 行0:2列
    users[1] = new String[5]; // 行1:5列
    users[2] = null; // 行2:显式设为null,合法但需遍历时注意
  • 混合使用:部分行静态赋值,部分行动态扩展,适合运行时结构不确定的场景

安全遍历:传统 for 循环是首选

需要索引、要修改元素、或逻辑复杂时,传统双层 for 最清晰可控:

  • 外层循环判断 i ,确保不越行
  • 每轮进入内层前加 if (arr[i] != null),防止对 null 行调用 .length
  • 内层条件写 j ,而非 <code>arr[0].length——后者在不规则数组中无意义

示例代码:

立即学习“Java免费学习笔记(深入)”;

for (int i = 0; i < arr.length; i++) {<br>  if (arr[i] != null) {<br>    for (int j = 0; j < arr[i].length; j++) {<br>      System.out.print(arr[i][j] + " ");<br>    }<br>  }<br>  System.out.println();<br>}

简洁遍历:增强 for 循环需谨慎使用

适合只读、语义清晰、不依赖行列索引的场景,但对 null 更敏感:

  • 外层类型必须是 int[] row : arr(不能写成 int x : arr
  • row 是引用,必须先判空:if (row != null),否则 for (int x : row) 直接报错
  • 无法获知当前是第几行第几列,不适合需要定位的逻辑

示例代码:

立即学习“Java免费学习笔记(深入)”;

for (int[] row : arr) {<br>  if (row != null) {<br>    for (int x : row) {<br>      System.out.print(x + " ");<br>    }<br>  }<br>  System.out.println();<br>}

按列遍历:先求最大列宽,再逐列检查

不规则数组没有统一列数,不能假设所有行都有第 c 列。安全做法分两步:

  • 第一遍扫描:遍历所有非 null 行,计算最大列数
    int maxCols = 0;<br>  for (int[] row : arr) {<br>    if (row != null) maxCols = Math.max(maxCols, row.length);<br>  }
  • 第二遍输出:外层循环列索引 c0maxCols - 1,内层遍历每行 r,仅当 arr[r] != null && c 时才访问 <code>arr[r][c]

这样能保证每列输出“视觉对齐”,跳过缺失位置,不中断流程。

热门栏目