Skip to content

for 循环

已知循环次数时首选的循环结构。

基本语法

java
for (初始化; 条件判断; 更新) {
    // 循环体
}

执行流程:

初始化 → 条件判断 → 循环体 → 更新 → 条件判断 → 循环体 → 更新 → ...

              false → 结束

基础用法

输出 1-10

java
for (int i = 1; i <= 10; i++) {
    System.out.println(i);
}

计算 1-100 的和

java
int sum = 0;
for (int i = 1; i <= 100; i++) {
    sum += i;
}
System.out.println("1+2+...+100 = " + sum);

遍历数组

java
int[] arr = {1, 2, 3, 4, 5};

// 传统 for 循环
for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i]);
}

// for-each(增强 for 循环)
for (int num : arr) {
    System.out.println(num);
}

常见遍历模式

正序遍历

java
for (int i = 0; i < n; i++) {
    // i = 0, 1, 2, ..., n-1
}

逆序遍历

java
for (int i = n - 1; i >= 0; i--) {
    // i = n-1, n-2, ..., 1, 0
}

指定步长

java
// 步长为 2
for (int i = 0; i < 10; i += 2) {
    // i = 0, 2, 4, 6, 8
}

多个变量控制

java
for (int i = 0, j = 10; i < j; i++, j--) {
    System.out.println("i = " + i + ", j = " + j);
}

实战:打印九九乘法表

嵌套循环的经典应用。

java
for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {
        System.out.print(j + "*" + i + "=" + (i * j) + "\t");
    }
    System.out.println();
}

// 输出:
// 1*1=1
// 1*2=2	2*2=4
// 1*3=3	2*3=6	3*3=9
// ...

打印图案

打印矩形

java
for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 5; j++) {
        System.out.print("*");
    }
    System.out.println();
}

打印三角形

java
for (int i = 0; i < 5; i++) {
    for (int j = 0; j <= i; j++) {
        System.out.print("*");
    }
    System.out.println();
}

// 输出:
// *
// **
// ***
// ****
// *****

特殊用法

省略部分表达式

java
// 省略初始化(需在外部定义变量)
int i = 0;
for (; i < 10; i++) {
    System.out.println(i);
}

// 省略更新(更新放在循环体中)
for (int i = 0; i < 10; ) {
    System.out.println(i);
    i++;
}

// 省略所有(死循环)
for (;;) {
    if (condition) break;
}

循环变量作用域

在循环中声明的变量作用域仅在循环内。

java
for (int i = 0; i < 10; i++) {
    // i 只在这个循环中有效
}
// System.out.println(i);  // ❌ 编译错误

// 外部声明的作用域更大
int i;
for (i = 0; i < 10; i++) { }
System.out.println(i);  // ✅ i = 10

常见问题

循环变量类型

使用 int 而非 Integer,避免不必要的装箱操作。

java
// ✅ 使用 int
for (int i = 0; i < list.size(); i++) { }

// ❌ 使用 Integer(不必要的装箱)
for (Integer i = 0; i < list.size(); i++) { }

浮点数循环

浮点数存在精度问题,尽量使用整数循环。

java
// ❌ 不推荐
for (double d = 0.0; d <= 1.0; d += 0.1) {
    System.out.println(d);  // 可能出现精度问题
}

// ✅ 推荐:使用整数循环
for (int i = 0; i <= 10; i++) {
    double d = i / 10.0;
    System.out.println(d);
}

性能优化

减少循环中的计算

java
List<String> list = getList();

// ❌ 每次循环都计算 size()
for (int i = 0; i < list.size(); i++) { }

// ✅ 只计算一次
for (int i = 0, len = list.size(); i < len; i++) { }

使用局部变量缓存

java
// ✅ 缓存到局部变量
for (int i = 0, len = list.size(); i < len; i++) {
    String item = list.get(i);
    process(item);
}

// ❌ 重复计算
for (int i = 0; i < list.size(); i++) {
    process(list.get(i));
}

循环展开

减少循环次数,每次处理多个元素。

java
// 普通循环
for (int i = 0; i < n; i++) {
    process(list[i]);
}

// 循环展开
for (int i = 0; i < n - 3; i += 4) {
    process(list[i]);
    process(list[i + 1]);
    process(list[i + 2]);
    process(list[i + 3]);
}
// 处理剩余元素
for (int i = n - (n % 4); i < n; i++) {
    process(list[i]);
}

for vs while

特点for 循环while 循环
适用场景已知循环次数未知循环次数
语法结构初始化、条件、更新在一起分散在各处
java
// for 循环 - 适合已知次数
for (int i = 0; i < 10; i++) {
    System.out.println(i);
}

// while 循环 - 适合未知次数
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
    String input = scanner.next();
    if ("quit".equals(input)) break;
    process(input);
}

基于 VitePress 构建