java二维数组本质是“数组的数组”,需区分规则与不规则初始化、校验索引边界、选择合适遍历方式,并利用引用特性避免冗余返回。

Java 二维数组不是“真正的矩阵”,而是一个一维数组,每个元素又指向另一个一维数组。理解这点,是写出健壮、可维护代码的前提。
初始化必须分清规则与不规则场景
规则二维数组(每行列数相同)适合用 new int[rows][cols] 一次性分配;不规则数组(如三角形、稀疏结构)则需先声明外层数组,再逐行为内层数组分配空间。例如:
- 规则:
int[][] grid = new int[5][4];—— 所有行都有 4 列,grid[0].length可安全用于所有行 - 不规则:
int[][] jagged = new int[3][];后必须显式赋值jagged[0] = new int[2]; jagged[1] = new int[5];,否则访问jagged[i][j]会触发NullPointerException
访问前务必校验索引边界
二维数组的行数是 arr.length,但列数不能默认用 arr[0].length——尤其在不规则数组中,每行长度可能不同。正确做法是:
- 访问前检查
i = 0 - 再检查
j = 0 - 避免直接写
arr[3][3]这类硬编码索引,应封装为带校验的方法
遍历优先选语义清晰的方式
行优先遍历(外层行、内层列)最常用,也最符合缓存友好性;列优先遍历需注意不规则数组的列边界不统一:
- 规则数组列优先:外层循环列索引
for (int c = 0; c ,内层循环行索引 <code>for (int r = 0; r - 不规则数组列优先:先求最大列宽
int maxCols = Arrays.stream(arr).mapToInt(row -> row.length).max().orElse(0);,再对每列遍历时加if (r 判断
修改数组时善用引用特性,避免无谓返回
Java 数组是引用类型,方法传入二维数组后直接修改其元素,原始数组即被更新。因此,若方法目标是“放置一个值”,返回坐标比返回整个数组更实用:
- 错误设计:
int[][] put(int[][] board, int val)—— 返回原数组,调用方仍需额外查找位置 - 推荐设计:
int[] place(int[][] board, int val)—— 直接返回{row, col},明确表达意图,也规避重复值定位歧义
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











