7. Java 二维数组
发布时间:2026/9/3 14:56:37 作者:尧图编辑部 阅读量:1,286

定义Java 的二维数组本质是数组的数组外层数组的每个元素是一个一维数组的引用。一维数组 [1, 2, 3] 二维数组 [[1, 2, 3], [4, 5, 6]] // 2行×3列与 C 语言连续内存模型不同Java 的二维数组各内层数组在堆中独立分配因此天然支持不规则数组每行列数可不同。三种定义方式方式一静态初始化已知全部元素时使用String[][] scores { {张三, 90, 85}, {李四, 88, 92} }; int[][] matrix { {1, 2, 3}, {4, 5, 6} };方式二动态初始化先分配内存再逐个赋值int[][] arr new int[3][2]; // 3行2列元素默认值 0 arr[0][0] 10; arr[0][1] 20; arr[1][0] 30;方式三不规则数组只指定行数每行列数单独定义int[][] jagged new int[2][]; jagged[0] new int[2]; // 第0行2列 jagged[1] new int[3]; // 第1行3列 jagged[0][0] 1; jagged[1][2] 9;静态初始化也可定义不规则数组int[][] jagged { {1, 2}, {3, 4, 5}, {6} };访问与修改通过数组名[行索引][列索引]定位元素索引从 0 开始String[][] scores { {张三, 90, 85}, {李四, 88, 92} }; String math scores[0][2]; // 取值85 scores[1][1] 95; // 赋值获取行列数int rows scores.length; // 行数2 int cols scores[0].length; // 第0行列数3不规则数组中每行列数可能不同取列数必须用arr[i].length而非arr[0].length。遍历方式普通 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 (int[] row : matrix) { for (int num : row) { System.out.print(num ); } System.out.println(); }Stream 流式遍历JDK 8import java.util.Arrays; Arrays.stream(matrix) .forEach(row - { Arrays.stream(row) .forEach(num - System.out.print(num )); System.out.println(); });遍历方式对比遍历方式优点缺点适用场景普通 for有索引可修改元素代码较长需要定位或修改元素增强 for代码简洁无索引不可修改仅读取元素Stream函数式可链式过滤映射JDK 8 支持需要数据过滤转换不规则数组遍历内层循环上限必须用当前行的lengthint[][] jagged { {1, 2}, {3, 4, 5} }; for (int i 0; i jagged.length; i) { for (int j 0; j jagged[i].length; j) { System.out.print(jagged[i][j] ); } System.out.println(); } // 输出 // 1 2 // 3 4 5若改用jagged[0].length固定为 2第 1 行的第三个元素5会丢失。常见操作计算元素总和int[][] nums {{1, 2}, {3, 4}, {5, 6}}; int sum 0; for (int[] row : nums) { for (int num : row) { sum num; } } System.out.println(sum); // 21查找最大值int[][] nums {{12, 8}, {9, 25}, {7, 18}}; int max nums[0][0]; for (int[] row : nums) { for (int num : row) { if (num max) { max num; } } } System.out.println(max); // 25内存结构int[][] arr new int[2][3];内存布局栈变量arr存外层数组的地址外层数组堆长度 2每个元素存一个内层数组的地址内层数组 1堆长度 3 的int数组元素默认值 0内层数组 2堆长度 3 的int数组元素默认值 0关键结论Java 二维数组不是连续矩形内存而是「外层引用数组 多个独立一维数组」的组合因此每行可独立分配不同长度访问元素需两次寻址。注意事项问题触发条件异常类型索引越界i arr.length或j arr[i].lengthArrayIndexOutOfBoundsException空指针定义了行但未初始化int[][] arr new int[2][]; arr[0][0] 1;NullPointerException遍历遗漏不规则数组用arr[0].length作为所有行列数上限逻辑错误索引范围示例int[][] arr new int[3][4]; // 行索引0 ~ 2 (arr.length - 1) // 列索引0 ~ 3 (arr[0].length - 1) // arr[3][0] → ArrayIndexOutOfBoundsException // arr[0][4] → ArrayIndexOutOfBoundsException典型应用场景场景示例表格数据学生成绩表、商品信息表、员工考勤数学矩阵矩阵加法、矩阵乘法、矩阵转置游戏棋盘五子棋、扫雷、贪吃蛇多层分类省→市→区、大类→小类→商品