二维数组的基本概念
在Java中,二维数组本质上是一个“数组的数组”,即每个元素本身也是一个数组,与一维数组不同,二维数组可以表示具有行和列结构的数据,例如矩阵、表格图像像素等,理解二维数组的核心在于掌握其“行优先”的存储逻辑,即第一维表示行数,第二维表示列数。int[][] matrix表示一个整数类型的二维数组,其中matrix.length表示行数,matrix[i].length表示第i行的列数。

静态初始化:直接指定数组元素
静态初始化是指在创建二维数组时直接为其赋值,适用于已知所有元素的场景,语法格式为:
数据类型[][] 数组名 = new 数据类型[][]{
{元素1, 元素2, ...},
{元素3, 元素4, ...},
...
};
创建一个3行4列的整数二维数组并初始化:
int[][] matrix = new int[][]{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
还可以简化写法(省略new 数据类型[][]):
int[][] matrix = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
注意事项:
- 静态初始化时,内层大括号的个数决定行数,每个内层大括号中的元素个数决定对应行的列数。
- 允许不同行的列数不同(即“不规则二维数组”),
int[][] irregularArray = {
{1, 2},
{3, 4, 5},
{6}
};
动态初始化:先指定维度后赋值
动态初始化是指先定义二维数组的行数和列数,再通过索引逐个赋值,适用于需要先确定数组结构、后续再填充数据的场景,语法格式为:
数据类型[][] 数组名 = new 数据类型[行数][列数];
创建一个2行3列的字符串二维数组:

String[][] names = new String[2][3];
赋值方式:通过索引访问元素,格式为数组名[行索引][列索引],索引从0开始。
names[0][0] = "Alice"; names[0][1] = "Bob"; names[0][2] = "Charlie"; names[1][0] = "David"; names[1][1] = "Eve"; names[1][2] = "Frank";
不规则二维数组的动态初始化:若需要创建行数固定但列数不等的二维数组,需先创建行数组,再为每行分配列空间。
int[][] irregularArray = new int[3][]; // 先定义3行 irregularArray[0] = new int[2]; // 第0行有2列 irregularArray[1] = new int[3]; // 第1行有3列 irregularArray[2] = new int[1]; // 第2行有1列
二维数组的遍历与操作
遍历二维数组是常见的操作,通常使用嵌套循环实现:外层循环遍历行,内层循环遍历列。
使用for循环遍历
int[][] matrix = {{1, 2}, {3, 4, 5}, {6}};
for (int i = 0; i < matrix.length; i++) { // 遍历行
for (int j = 0; j < matrix[i].length; j++) { // 遍历列
System.out.print(matrix[i][j] + " ");
}
System.out.println(); // 换行
}
输出结果:
1 2
3 4 5
6
使用增强for循环(for-each)
增强for循环简化了遍历代码,但无法直接获取索引,适用于仅需访问元素值的场景:
int[][] matrix = {{1, 2}, {3, 4, 5}};
for (int[] row : matrix) { // 遍历每一行(一维数组)
for (int element : row) { // 遍历行中的每个元素
System.out.print(element + " ");
}
System.out.println();
}
二维数组的长度属性
数组名.length:返回二维数组的行数。数组名[i].length:返回第i行的列数(适用于不规则数组)。
int[][] matrix = {{1, 2, 3}, {4, 5}};
System.out.println("行数: " + matrix.length); // 输出2
System.out.println("第0行列数: " + matrix[0].length); // 输出3
System.out.println("第1行列数: " + matrix[1].length); // 输出2
二维数组的内存机制
理解二维数组的内存结构有助于避免常见错误。

int[][] arr1 = new int[2][3]; int[][] arr2 = arr1; // arr2引用arr1的内存地址 arr2[0][0] = 100; // 修改arr2会影响arr1 System.out.println(arr1[0][0]); // 输出100
若需要创建二维数组的“深拷贝”(即复制数据而非引用),需逐行复制:
int[][] original = {{1, 2}, {3, 4}};
int[][] copy = new int[original.length][];
for (int i = 0; i < original.length; i++) {
copy[i] = original[i].clone(); // 克隆每一行
}
二维数组的实际应用场景
二维数组在编程中应用广泛,常见场景包括:
- 矩阵运算:如矩阵加法、乘法、转置等数学计算。
- 游戏开发:表示地图网格(如棋盘、迷宫)、角色位置等。
- 数据处理:存储表格数据(如Excel中的行和列)。
- 图像处理:用二维数组存储像素值(每个元素代表一个像素的颜色)。
用二维数组实现简单的矩阵加法:
int[][] matrixA = {{1, 2}, {3, 4}};
int[][] matrixB = {{5, 6}, {7, 8}};
int[][] result = new int[2][2];
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
result[i][j] = matrixA[i][j] + matrixB[i][j];
}
}
// 输出结果
for (int[] row : result) {
for (int num : row) {
System.out.print(num + " ");
}
System.out.println();
}
输出结果:
6 8
10 12
创建二维数组的核心在于理解“数组的数组”这一概念,通过静态初始化直接赋值或动态初始化后逐个填充数据,遍历时需注意行和列的索引范围,尤其对于不规则二维数组,需通过数组名[i].length获取每行的实际列数,掌握二维数组的内存机制和实际应用场景,能有效提升处理复杂数据结构的能力,无论是数学计算、游戏开发还是数据处理,二维数组都是Java编程中不可或缺的工具。


















