Java二维数组本质是“数组的数组”,声明需指定第一维长度;支持静态分配(如new int3)、不规则分配(如new int[3][])和静态初始化(如{{1,2},{3,4,5}});遍历时须判空防NullPointerException。

Java里二维数组的声明和初始化方式
Java中没有真正意义上的“多维数组”,只有“数组的数组”。所谓二维数组,本质是一个一维数组,其每个元素又是另一个一维数组。
声明时必须明确第一维长度(即行数),第二维可以延迟分配;否则编译报错 Array dimension missing。
-
int[][] arr = new int[3][4];—— 静态分配,3行4列,所有元素默认为0 -
int[][] arr = new int[3][];—— 只分配行,每行可不同长度:arr[0] = new int[2]; arr[1] = new int[5]; -
int[][] arr = {{1,2}, {3,4,5}};—— 静态初始化,编译器自动推导维度,arr.length == 2,arr[0].length == 2,arr[1].length == 3
遍历二维数组时常见的空指针异常
如果用了不规则二维数组(即 new int[3][] 形式但未给某行赋值),直接访问该行元素会触发 NullPointerException。
安全遍历必须先判空:
立即学习“Java免费学习笔记(深入)”;
for (int i = 0; i < arr.length; i++) {
if (arr[i] != null) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
}
System.out.println();
}用增强for循环更简洁但同样要防空:if (row != null) 不可省略。
二维数组作为方法参数传递的注意事项
Java中数组是引用类型,传参时传递的是引用副本。修改数组内容会影响原数组,但重新赋值不会:
-
void modify(int[][] a) { a[0][0] = 999; }→ 原数组首元素被改 -
void reassign(int[][] a) { a = new int[2][2]; }→ 原引用不受影响 - 方法无法通过参数得知数组是否为“不规则”结构,
a.length和a[i].length必须分别检查
性能与内存布局:为什么不要轻易嵌套三层以上
每层都是独立对象,int[3][4][5] 实际创建了 1(外层数组)+ 3(中间层)+ 12(最内层数组)= 16 个对象,GC压力明显增大。
连续内存访问优势也丧失:JVM不保证各子数组在内存中相邻,缓存友好性远不如一维数组模拟二维(如 data[row * cols + col])。
若需高性能或大尺寸,优先考虑扁平化 + 索引计算,或改用 ArrayList 等动态结构。>










