二维数组遍历本质是将线性内存映射为“行×列”逻辑关系,关键在于明确索引含义、边界条件与业务语义对应;row 表示行号(0 到 rows−1),col 表示列号(0 到 cols−1),应按行优先遍历并动态适配不规则数组,避免硬编码和空指针异常。

二维数组遍历本质是将线性内存结构映射为逻辑上的“行×列”关系,关键不在嵌套循环本身,而在于明确索引含义、边界条件和业务语义的对应关系。
理解 row 和 col 的角色分工
在 int[][] grid = new int[3][4] 中,第一维长度决定行数(row count),第二维长度决定每行的列数(col count)。访问 grid[i][j] 时,i 是行号(0 到 rows-1),j 是该行内的列号(0 到 cols-1)。常见错误是混淆二者顺序,比如用 j 控制外层循环——这会破坏“按行处理”的自然语义,增加理解与调试成本。
- 按行优先遍历:外层
i从 0 到grid.length - 1,内层j从 0 到grid[i].length - 1 - 避免硬编码
grid[0].length作为列数,除非确认每行长度一致;否则应使用grid[i].length动态适配不规则数组
处理不规则二维数组的健壮写法
Java 允许“锯齿状”数组(如 String[][] names = {{"Alice"}, {"Bob", "Charlie", "Diana"}, {}}),此时 grid[i] 可能为 null 或长度为 0。直接访问 grid[i][j] 易触发 NullPointerException 或 ArrayIndexOutOfBoundsException。
- 遍历时先判空:
if (grid == null || grid[i] == null) continue; - 列边界用
grid[i].length而非固定值,确保每行独立校验 - 若需统一列数逻辑(如矩阵运算),应在初始化或输入阶段做合法性检查,而非在遍历中强行补齐
索引映射到业务坐标的常见转换
实际开发中,数组索引常需转为用户可见坐标(如棋盘第1行第1列、Excel 的 A1 表示法)或物理位置(如图像像素的 x/y)。例如:
- 显示为“第 i+1 行,第 j+1 列”:打印时用
"Row " + (i + 1) + ", Col " + (j + 1) - 转 Excel 列名(A-Z, AA-AZ…):对
j做 26 进制偏移计算,注意从 0 开始而非 1 - 图像处理中,
i通常对应 y 坐标(垂直方向),j对应 x 坐标(水平方向),符合屏幕坐标系习惯
用增强 for 循环简化逻辑但不忘索引需求
增强 for(for (int[] row : grid))可提升可读性,但会丢失行列索引。若业务需要知道当前位于第几行、第几列,有三种实用方案:
- 外层用传统 for 获取
i,内层用增强 for 遍历row,再用局部计数器j记录列位置 - 内层改用传统 for,并基于
row.length确定范围,保持索引完整 - 封装为带索引的工具方法,如
forEachWithIndex(grid, (i, j, val) -> {...}),适合高频使用场景
索引映射不是语法技巧,而是把程序逻辑和问题域对齐的过程。写对一次遍历,靠的是想清“谁是行、谁是列、边界在哪、意义为何”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











