循环嵌套与优化
循环内部再包含循环,适合处理多维数据结构。
二维数组遍历
java
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();
}
// 输出:
// 1 2 3
// 4 5 6
// 7 8 9三维数组类似,用三层循环遍历。
实战:打印三角形
左上三角形
java
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
/*
*
**
***
****
*****
*/右上三角形
java
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 5 - i; j++) {
System.out.print(" ");
}
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
/*
*
**
***
****
*****
*/菱形
java
// 上半部分
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5 - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print("*");
}
System.out.println();
}
// 下半部分
for (int i = 4; i >= 0; i--) {
for (int j = 0; j < 5 - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print("*");
}
System.out.println();
}实战:打印九九乘法表
java
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.printf("%d*%d=%2d\t", j, i, i * j);
}
System.out.println();
}查找二维数组中的元素
java
public class SearchDemo {
public static void main(String[] args) {
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int target = 5;
boolean found = false;
outer:
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
if (matrix[i][j] == target) {
System.out.println("找到 " + target + " 在 [" + i + "][" + j + "]");
found = true;
break outer; // 使用标签跳出外层循环
}
}
}
if (!found) {
System.out.println("未找到 " + target);
}
}
}break 与 continue
break 跳出循环
java
// 普通 break:只跳出内层循环
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (matrix[i][j] == target) {
System.out.println("找到:" + i + "," + j);
break; // 只跳出内层循环
}
}
}
// 标签 break:跳出外层循环
outer:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (matrix[i][j] == target) {
System.out.println("找到:" + i + "," + j);
break outer; // 跳出外层循环
}
}
}continue 跳过本次
java
// 跳过偶数
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue; // 跳过本次循环
}
System.out.println(i); // 只打印奇数
}性能优化
减少循环次数
java
int[][] matrix = new int[1000][1000];
// ❌ 低效:每次都调用 length
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) { }
}
// ✅ 高效:缓存长度
for (int i = 0, rowLen = matrix.length; i < rowLen; i++) {
for (int j = 0, colLen = matrix[i].length; j < colLen; j++) { }
}循环展开
减少循环次数,每次处理多个元素。
java
// ❌ 普通循环
for (int i = 0; i < arr.length; i++) {
arr[i] *= 2;
}
// ✅ 循环展开
for (int i = 0; i < arr.length; i += 4) {
arr[i] *= 2;
if (i + 1 < arr.length) arr[i + 1] *= 2;
if (i + 2 < arr.length) arr[i + 2] *= 2;
if (i + 3 < arr.length) arr[i + 3] *= 2;
}合并循环
对相同范围的操作可以合并。
java
int[] a = new int[1000];
int[] b = new int[1000];
// ❌ 两个循环
for (int i = 0; i < a.length; i++) { a[i] *= 2; }
for (int i = 0; i < b.length; i++) { b[i] *= 2; }
// ✅ 合并为一个循环
for (int i = 0; i < a.length; i++) {
a[i] *= 2;
b[i] *= 2;
}顺序调整优化缓存
行优先访问更符合 CPU 缓存机制。
java
int[][] matrix = new int[1000][1000];
// ❌ 列优先访问(缓存不友好)
for (int j = 0; j < matrix[0].length; j++) {
for (int i = 0; i < matrix.length; i++) {
process(matrix[i][j]);
}
}
// ✅ 行优先访问(缓存友好)
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
process(matrix[i][j]);
}
}时间复杂度
嵌套循环的复杂度是各层循环次数的乘积:
java
// 二重循环:O(n²)
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) { }
}
// 三重循环:O(n³)
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) { }
}
}