Skip to content

循环嵌套与优化

循环内部再包含循环,适合处理多维数据结构。

二维数组遍历

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++) { }
    }
}

基于 VitePress 构建