元数据卡
- 前置知识:第6章前文(一维数组声明、遍历、操作)
- 预计时间:10 分钟
- 阅读模式:👣稳步推进
- 完成标志:能创建和遍历二维数组;理解不规则数组(锯齿数组)
遇到问题
一条街不够用了。
你要处理一个 3×4 的棋盘,或者一张 5×5 的灰度图像。每行 4 个格子、一共 3 行——一维数组 int[12] 虽然能存,但你得自己算"第 2 行第 3 列在第几个位置":2 * 4 + 3 = 11。太原始了。
如果让 Java 帮你管理行和列呢?
第五幕:棋盘与矩阵——二维数组
二维数组就是数组的数组。
java
// 声明一个 3 行 4 列的二维数组
int[][] matrix = new int[3][4];
// 静态初始化
int[][] grid = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// 访问:行索引在前,列索引在后
System.out.println(grid[0][0]); // 第一行第一列:1
System.out.println(grid[1][2]); // 第二行第三列:7
System.out.println(grid[2][3]); // 第三行第四列:12语言:Java 如何运行:定义后直接打印访问 行 vs 列:int[row][col]——第一个索引是行,第二个是列
遍历二维数组——双层循环:
java
int[][] grid = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// 外层循环遍历每一行,内层循环遍历每一列
for (int i = 0; i < grid.length; i++) { // grid.length = 行数
for (int j = 0; j < grid[i].length; j++) { // grid[i].length = 当前行的列数
System.out.print(grid[i][j] + " ");
}
System.out.println(); // 每行结束后换行
}语言:Java 预期输出:
1 2 3 4
5 6 7 8
9 10 11 12关键点:grid.length 是行数(3),grid[0].length 是第一行的列数(4)
也可以配合增强 for 遍历:
java
for (int[] row : grid) {
for (int val : row) {
System.out.print(val + " ");
}
System.out.println();
}Java 的特殊点:不规则数组(锯齿数组)
Java 的二维数组本质上是一维数组的数组,所以每一行可以有不同长度:
java
int[][] jagged = new int[3][];
jagged[0] = new int[4]; // 第一行 4 列
jagged[1] = new int[2]; // 第二行 2 列
jagged[2] = new int[5]; // 第三行 5 列
// 或者静态初始化
int[][] triangle = {
{1},
{2, 3},
{4, 5, 6}
};语言:Java 关键点:创建二维数组时,new int[3][] 只确定了行数,每行还需要单独 new
遍历不规则数组依然用双层循环:
java
for (int i = 0; i < triangle.length; i++) {
for (int j = 0; j < triangle[i].length; j++) {
System.out.print(triangle[i][j] + " ");
}
System.out.println();
}预期输出:
1
2 3
4 5 6语言差异:C++ 的
int arr[3][4]是严格的矩形数组(连续内存块),而 Java 的int[3][4]是 3 个指向一维数组的引用。Java 中每一行可以各不同长。
🧠 大脑缓存
- 二维数组 = 数组的数组:
int[][] grid.length= 行数,grid[i].length= 第 i 行的列数- 访问:
grid[row][col] - 遍历:外层行、内层列,双层循环
- Java 支持不规则数组(锯齿数组),每行长度不同
- 用命名区分循环变量(
row/col),别只用i/j搞混行和列
下一步
概念都学完了?来动手验证吧。下一节全是练习——热身、挑战、排障,帮你把知识变成肌肉记忆。