理解Java二维数组的基本结构
在Java中,二维数组本质上是一个“数组的数组”,即每个元素本身也是一个数组。int[][] matrix = new int[3][4]; 定义了一个3行4列的二维数组,其中matrix[0]、matrix[1]、matrix[2]分别代表三个一维数组(行),遍历二维数组的核心目标是访问或处理其中的每一个元素,而掌握其结构是高效遍历的前提。

使用传统for循环遍历
传统for循环是最基础且灵活的遍历方式,通过嵌套循环实现外层遍历行、内层遍历列。
int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
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(); // 换行
}
优点:直观可控,可随时通过索引访问元素,适合需要精确控制遍历顺序的场景。
注意:matrix.length表示行数,matrix[i].length表示第i行的列数(二维数组每行列数可不同)。
增强for循环(foreach)简化遍历
增强for循环(for-each)语法更简洁,无需关心索引,适合仅需读取元素值的场景。

int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
for (int[] row : matrix) { // 遍历每一行(一维数组)
for (int num : row) { // 遍历行中的每个元素
System.out.print(num + " ");
}
System.out.println();
}
优点:代码简洁,避免索引越界风险,适合快速遍历或打印。
局限:无法直接修改元素值(若需修改,需通过传统for循环+索引实现)。
结合Stream API实现函数式遍历(Java 8+)
Java 8引入的Stream API为二维数组遍历提供了函数式风格,支持链式操作和并行处理。
int[][] matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
Arrays.stream(matrix) // 将二维数组转为Stream<int[]>
.flatMapToInt(Arrays::stream) // 将每个int[]扁平化为IntStream
.forEach(num -> System.out.print(num + " "));
优点:代码简洁,支持过滤、映射等操作(如filter、map),适合复杂数据处理。
示例:计算所有元素总和

int sum = Arrays.stream(matrix)
.flatMapToInt(Arrays::stream)
.sum();
System.out.println("总和: " + sum);
处理不规则二维数组(行列数不等)
当二维数组每行的列数不同时(如int[][] jaggedArray = {{1, 2}, {3, 4, 5}, {6}};),需确保内层循环使用row.length而非固定值。
for (int[] row : jaggedArray) {
for (int num : row) {
System.out.print(num + " ");
}
System.out.println();
}
遍历性能与场景选择
- 传统for循环:适合需要频繁修改元素或复杂索引逻辑的场景,性能最优。
- 增强for循环:适合简单遍历或只读操作,代码可读性高。
- Stream API:适合函数式编程风格或需要并行处理的大数据量场景,但存在一定的性能开销。
Java二维数组的遍历方式多样,需根据具体需求选择:传统for循环灵活可控,增强for循环简洁易读,Stream API则适合函数式操作,理解二维数组的“数组数组”结构,并结合行列数特点(尤其是不规则数组),是高效遍历的关键,掌握这三种方式,能应对绝大多数二维数组遍历场景。

















