规则二维数组本质是固定行列数的“数组的数组”,应使用new introws一次性初始化,校验行列索引防越界,利用引用特性直接修改而非冗余返回。

规则二维数组在 Java 中本质是“固定行列数的数组的数组”,最佳实践核心在于明确结构、避免越界、兼顾性能与可读性。它不是数学意义上的矩阵,而是一维引用数组,每个元素指向长度一致的一维数组。
初始化必须一步到位,避免空引用风险
规则数组意味着所有行长度相同,应优先使用一次性动态初始化语法,确保内存连续且各内层数组非 null。
- 推荐写法:`int[][] grid = new int[rows][cols];` —— JVM 直接分配 rows × cols 连续空间,每行自动初始化为长度 cols 的数组
- 不推荐写法:`int[][] grid = new int[rows][];` 后再逐行 `grid[i] = new int[cols];` —— 多余步骤,易遗漏某行导致 NullPointerException
- 静态初始化也适用规则场景:`String[][] states = {{"California", "Sacramento"}, {"Texas", "Austin"}};` —— 编译期确定结构,语义清晰
访问时始终校验行索引,列索引用当前行长度
即使规则数组,也不能假设 `arr[0].length` 对所有行都安全——若数组为空(`arr.length == 0`),访问 `arr[0]` 会抛出异常;列长虽统一,但访问前仍需防越界。
- 安全获取元素:先检查 `if (r >= 0 && r = 0 && c
- 避免硬编码:不用 `arr[2][5]`,改用变量或封装方法,例如 `getSafe(arr, row, col, defaultValue)`
- 遍历时直接用 `arr[i].length` 获取列数,比 `arr[0].length` 更鲁棒(尤其配合空数组防御)
遍历首选行优先,兼顾缓存局部性
Java 数组在堆中按行主序(row-major)连续存储,行优先遍历能最大化 CPU 缓存命中率,性能优于列优先。
- 标准双层 for:`for (int i = 0; i
- 增强 for 更简洁:`for (int[] row : arr) { for (int val : row) { ... } }` —— 语义明确,无需处理索引
- 列优先仅在特殊需求下使用(如转置),且需确保 `arr.length > 0`,否则 `arr[0].length` 不可用
修改无需返回数组,利用引用特性直改原数据
二维数组是引用类型,方法内部修改 `arr[i][j]` 会直接影响原始数组。返回整个数组既冗余又误导调用方以为发生了复制。
- 错误设计:`int[][] setCell(int[][] board, int r, int c, int val) { board[r][c] = val; return board; }`
- 合理设计:`void setCell(int[][] board, int r, int c, int val) { board[r][c] = val; }` 或返回操作结果(如是否成功)
- 若需定位信息,返回坐标更轻量:`int[] find(String[][] data, String target)` 返回 `{row, col}`,而非新数组
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











