java二维数组是“一维数组的数组”,声明推荐int[][] arr,初始化分静态(如{{1,0,1},{0,1,0}})和动态(如new int4或new string[3][]),访问前须检查null和边界。

Java 二维数组不是“二维的盒子”,而是“一维数组的数组”——外层数组每个元素都指向一个一维数组(可能长度不同)。理解这点,才能写出健壮、不易出错的代码。
声明方式:推荐 int[][] arr 而非 int arr[][]
Java 官方推荐写法是 数据类型[][] 变量名,比如 int[][] grid。这种写法更清晰地表明“这是一个装着 int[] 的数组”,语义明确,也符合 Java 风格规范。C 风格写法(int arr[][] 或 int[] arr[])虽能编译,但易混淆,不建议在生产代码中使用。
初始化分两类:静态与动态,适用场景不同
静态初始化适合已知全部数据且结构较固定的情况;动态初始化更适合运行时确定尺寸或需逐个赋值的逻辑。
-
静态初始化(声明即赋值):直接用花括号嵌套,每行用逗号分隔,末尾不加逗号。
例:int[][] board = {{1, 0, 1}, {0, 1, 0}, {1, 1, 0}};
注意:此时各行长度可不同(不规则数组),如{{1}, {2, 3}, {4, 5, 6}}是合法的。 -
动态初始化(先分配内存,再填值):
– 指定行列:int[][] matrix = new int[4][5];→ 所有元素自动初始化为 0(或 false、null 等默认值);
– 只指定行数:String[][] names = new String[3][];→ 外层数组有 3 个 null 元素,每行需单独初始化,例如names[0] = new String[]{"Alice", "Bob"};。
访问与遍历时必须检查边界,避免 NullPointerException 和 ArrayIndexOutOfBoundsException
二维数组本质是引用数组,每一行可能是 null;而且每行长度可能不一致。直接用 arr[i][j] 前务必确认两层有效性。
- 安全遍历模板:
for (int i = 0; i if (arr[i] != null) {<br> for (int j = 0; j // 安全访问 arr[i][j]<br> }<br> }<br>} - 常见陷阱:
–arr.length是行数,不是总元素数;
–arr[0].length不能代表所有行长度(不规则数组下会越界);
– 对未初始化的某一行(如arr[2] == null)调用arr[2].length会抛出 NullPointerException。
提升健壮性的三个实用技巧
写二维数组相关逻辑时,多加一层防御,成本低但收益高。
-
封装初始化逻辑:把创建和校验逻辑抽成工具方法,比如
createGrid(int rows, int cols)内部判空、判负,统一返回新数组。 -
用增强 for 循环配合 null 检查:处理不规则数组更自然,例如
for (int[] row : grid) { if (row != null) { ... } }。 -
必要时用 List
- > 替代
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











