Java二维数组是“数组的数组”,即每个元素为一维数组,属引用类型嵌套结构;声明推荐int[][] arr;支持静态(如{{1,2},{3,4,5}})和动态(如new int[3][]后逐行分配)初始化;访问用arri,遍历时需用arr[i].length判断每行长度。

Java中的二维数组本质上是“数组的数组”,即每个元素本身是一个一维数组。它不是数学意义上的矩阵,而是一种引用类型嵌套结构,理解这点是正确使用的关键。
二维数组的声明与初始化
声明有两种常见形式:int[][] arr 或 int[] arr[],推荐前者,更清晰表达“二维数组”意图。
初始化分静态和动态:
- 静态初始化:直接给出所有元素,编译器推断大小
int[][] grid = {{1, 2}, {3, 4, 5}, {6}};—— 每行长度可不同(不规则数组) - 动态初始化:先指定行数,再逐行分配列数
int[][] matrix = new int[3][];matrix[0] = new int[2];matrix[1] = new int[3];matrix[2] = new int[1];
访问与遍历方式
通过两个下标访问:arr[i][j],其中 i 是行索引,j 是列索引。注意每行长度可能不同,不能默认 arr[i].length == arr[0].length。
立即学习“Java免费学习笔记(深入)”;
安全遍历推荐用增强for或传统双层for结合长度判断:
- 传统方式(适合需要索引的场景):
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
} - 增强for(简洁,无需索引):
for (int[] row : arr) {
for (int val : row) {
System.out.print(val + " ");
}
System.out.println();
}
常见误区与注意事项
二维数组变量本身只保存首地址,各子数组独立在堆中分配。这意味着:
- 赋值时是引用传递:
int[][] a = b;后修改a[0][0]会影响b[0][0] - 不能直接比较内容相等,
a == b判的是引用,要用Arrays.deepEquals(a, b) - 创建后未初始化的行是
null,访问前务必判空,否则抛NullPointerException - 没有内置方法获取“列数”,因为列长不统一;若需规则矩阵,应自行约定并维护
替代方案:List嵌套更灵活
当行长度动态变化频繁、需增删元素时,List 比二维数组更自然:>
- 支持自动扩容、插入删除操作
- 避免
null行问题,初始化即可用:List
- > table = new ArrayList<>();
table.add(Arrays.asList(1, 2));
table.add(Arrays.asList(3, 4, 5)); - 但性能略低、内存开销大,对大量数值计算场景仍首选原始类型二维数组










