java二维数组是“数组的数组”,声明时只写int[][] arr;合法,new int[3][]合法而new int[][4]非法;规则数组每行等长,不规则数组各行长度自由但需逐行判空遍历。

Java 多维数组不是“矩阵”而是“数组的数组”,理解这点才能避开空指针和越界错误。核心在于:第一维必须明确长度,第二维可延迟分配;规则数组每行等长,不规则数组各行长度自由,但遍历时必须逐行检查。
二维数组怎么声明才合法
声明时只写两个方括号,不指定任何维度大小是允许的:
- int[][] arr; —— 仅声明引用变量,arr 为 null,未分配内存
- int[][] arr = new int[3][]; —— 合法:分配了长度为 3 的一维引用数组,每个元素初始为 null
- int[][] arr = new int[][4]; —— 编译报错:第二维长度不能先于第一维指定
初始化分两类:规则 vs 不规则
规则数组适合表格类场景,所有行长度一致;不规则数组更灵活,比如表示树形结构或稀疏数据。
-
规则数组(静态):
int[][] grid = {{1, 2}, {3, 4}};—— 编译器推导为 2 行 × 2 列 -
规则数组(动态):
int[][] matrix = new int[3][4];—— 创建 3 行 4 列,所有元素自动为 0 -
不规则数组(字面量):
int[][] jagged = {{1}, {2, 3, 4}, {5, 6}};—— 每行长度不同,编译通过 -
不规则数组(手动分配):
int[][] arr = new int[3][]; arr[0] = new int[1]; arr[1] = new int[3]; arr[2] = new int[2];
访问与遍历必须防空指针
不规则数组或部分初始化的规则数组中,某一行可能为 null。直接用 arr[i][j] 会触发 NullPointerException,务必先校验。
- 安全遍历写法:
for (int i = 0; i - 获取行数用
arr.length,获取第 i 行列数用arr[i].length—— 注意不是arr.length[i] - 增强 for 循环适用于只读场景:
for (int[] row : arr) { if (row != null) for (int val : row) System.out.print(val + " "); }
常见错误与避坑提示
- 误以为
new int[3][4]和new int[4][3]等价 —— 行列顺序影响内存布局和逻辑含义 - 对未初始化的行调用
arr[i].length—— 抛出 NullPointerException,不是 ArrayIndexOutOfBoundsException - 混淆声明语法:
int[] arr[]虽能编译,但int[][] arr是标准写法,语义更清晰 - 用
arr.length当作总元素个数 —— 它只是行数;总元素需累加各arr[i].length
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











