for 关键字

概述

for 关键字用于创建循环结构,可以重复执行代码块。Java提供了传统for循环和增强for循环(for-each)两种形式。

语法格式

传统for循环

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

增强for循环(for-each)

for (元素类型 变量名 : 集合或数组) {
    // 循环体
}

基本用法

传统for循环

public class BasicForLoop {
    public static void main(String[] args) {
        // 基本计数循环
        System.out.println("=== 基本计数循环 ===");
        for (int i = 0; i < 5; i++) {
            System.out.println("第" + (i + 1) + "次循环,i = " + i);
        }

        // 倒序循环
        System.out.println("\n=== 倒序循环 ===");
        for (int i = 10; i > 0; i--) {
            System.out.println("倒计时:" + i);
        }

        // 步长为2的循环
        System.out.println("\n=== 步长为2的循环 ===");
        for (int i = 0; i <= 20; i += 2) {
            System.out.println("偶数:" + i);
        }

        // 多个初始化变量
        System.out.println("\n=== 多变量循环 ===");
        for (int i = 0, j = 10; i < j; i++, j--) {
            System.out.println("i = " + i + ", j = " + j);
        }
    }
}

增强for循环

import java.util.*;

public class EnhancedForLoop {
    public static void main(String[] args) {
        // 遍历数组
        System.out.println("=== 遍历数组 ===");
        int[] numbers = {1, 2, 3, 4, 5};
        for (int num : numbers) {
            System.out.println("数字:" + num);
        }

        // 遍历字符串数组
        System.out.println("\n=== 遍历字符串数组 ===");
        String[] names = {"张三", "李四", "王五"};
        for (String name : names) {
            System.out.println("姓名:" + name);
        }

        // 遍历List集合
        System.out.println("\n=== 遍历List集合 ===");
        List<String> fruits = Arrays.asList("苹果", "香蕉", "橙子");
        for (String fruit : fruits) {
            System.out.println("水果:" + fruit);
        }

        // 遍历Set集合
        System.out.println("\n=== 遍历Set集合 ===");
        Set<Integer> set = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5));
        for (Integer value : set) {
            System.out.println("集合元素:" + value);
        }
    }
}

嵌套for循环

public class NestedForLoop {
    public static void main(String[] args) {
        // 打印乘法表
        System.out.println("=== 九九乘法表 ===");
        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();
        }

        // 打印星号图案
        System.out.println("\n=== 星号三角形 ===");
        for (int i = 1; i <= 5; i++) {
            // 打印空格
            for (int j = 5; j > i; j--) {
                System.out.print(" ");
            }
            // 打印星号
            for (int k = 1; k <= i; k++) {
                System.out.print("* ");
            }
            System.out.println();
        }

        // 二维数组遍历
        System.out.println("\n=== 二维数组遍历 ===");
        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();
        }
    }
}

实际应用示例

import java.util.*;

public class ForLoopApplications {

    // 查找数组中的最大值
    public static int findMax(int[] array) {
        if (array.length == 0) {
            throw new IllegalArgumentException("数组不能为空");
        }

        int max = array[0];
        for (int i = 1; i < array.length; i++) {
            if (array[i] > max) {
                max = array[i];
            }
        }
        return max;
    }

    // 计算数组平均值
    public static double calculateAverage(double[] scores) {
        double sum = 0;
        for (double score : scores) {
            sum += score;
        }
        return sum / scores.length;
    }

    // 统计字符串中各字符出现次数
    public static Map<Character, Integer> countCharacters(String text) {
        Map<Character, Integer> charCount = new HashMap<>();

        for (int i = 0; i < text.length(); i++) {
            char ch = text.charAt(i);
            charCount.put(ch, charCount.getOrDefault(ch, 0) + 1);
        }

        return charCount;
    }

    // 生成斐波那契数列
    public static List<Integer> generateFibonacci(int n) {
        List<Integer> fibonacci = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            if (i <= 1) {
                fibonacci.add(i);
            } else {
                int next = fibonacci.get(i - 1) + fibonacci.get(i - 2);
                fibonacci.add(next);
            }
        }

        return fibonacci;
    }

    // 矩阵转置
    public static int[][] transpose(int[][] matrix) {
        int rows = matrix.length;
        int cols = matrix[0].length;
        int[][] transposed = new int[cols][rows];

        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                transposed[j][i] = matrix[i][j];
            }
        }

        return transposed;
    }

    public static void main(String[] args) {
        // 测试查找最大值
        int[] numbers = {3, 7, 2, 9, 1, 5};
        System.out.println("最大值:" + findMax(numbers));

        // 测试计算平均值
        double[] scores = {85.5, 92.0, 78.5, 88.0, 95.5};
        System.out.println("平均分:" + calculateAverage(scores));

        // 测试字符统计
        String text = "hello world";
        Map<Character, Integer> charCount = countCharacters(text);
        System.out.println("字符统计:" + charCount);

        // 测试斐波那契数列
        List<Integer> fibonacci = generateFibonacci(10);
        System.out.println("斐波那契数列:" + fibonacci);

        // 测试矩阵转置
        int[][] matrix = {{1, 2, 3}, {4, 5, 6}};
        int[][] transposed = transpose(matrix);
        System.out.println("原矩阵:");
        printMatrix(matrix);
        System.out.println("转置矩阵:");
        printMatrix(transposed);
    }

    private static void printMatrix(int[][] matrix) {
        for (int[] row : matrix) {
            for (int element : row) {
                System.out.print(element + " ");
            }
            System.out.println();
        }
    }
}

循环控制语句

public class LoopControl {
    public static void main(String[] args) {
        // 使用break跳出循环
        System.out.println("=== 使用break ===");
        for (int i = 1; i <= 10; i++) {
            if (i == 5) {
                System.out.println("遇到5,跳出循环");
                break;
            }
            System.out.println("i = " + i);
        }

        // 使用continue跳过当前迭代
        System.out.println("\n=== 使用continue ===");
        for (int i = 1; i <= 10; i++) {
            if (i % 2 == 0) {
                continue; // 跳过偶数
            }
            System.out.println("奇数:" + i);
        }

        // 标签break(跳出多层循环)
        System.out.println("\n=== 标签break ===");
        outer: for (int i = 1; i <= 3; i++) {
            for (int j = 1; j <= 3; j++) {
                if (i == 2 && j == 2) {
                    System.out.println("在(" + i + "," + j + ")处跳出外层循环");
                    break outer;
                }
                System.out.println("i=" + i + ", j=" + j);
            }
        }

        // 标签continue(继续外层循环)
        System.out.println("\n=== 标签continue ===");
        outer: for (int i = 1; i <= 3; i++) {
            for (int j = 1; j <= 3; j++) {
                if (j == 2) {
                    System.out.println("跳过i=" + i + "的剩余内层循环");
                    continue outer;
                }
                System.out.println("i=" + i + ", j=" + j);
            }
        }
    }
}

无限循环和特殊用法

public class SpecialForLoops {
    public static void main(String[] args) {
        // 省略初始化
        int i = 0;
        for (; i < 5; i++) {
            System.out.println("省略初始化:i = " + i);
        }

        // 省略更新表达式
        System.out.println("\n=== 省略更新表达式 ===");
        for (int j = 0; j < 5;) {
            System.out.println("手动更新:j = " + j);
            j++; // 手动更新
        }

        // 省略条件判断(无限循环,需要break跳出)
        System.out.println("\n=== 无限循环示例 ===");
        int count = 0;
        for (;;) {
            System.out.println("无限循环:" + count);
            count++;
            if (count >= 3) {
                break;
            }
        }

        // 空循环体
        System.out.println("\n=== 空循环体示例 ===");
        int sum = 0;
        for (int k = 1; k <= 5; sum += k, k++) {
            // 空循环体,所有操作在循环表达式中完成
        }
        System.out.println("求和结果:" + sum);
    }
}

性能和最佳实践

1. 循环优化

import java.util.*;

public class LoopOptimization {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("a", "b", "c", "d", "e");

        // 避免在循环中重复计算
        // 不好的做法
        for (int i = 0; i < list.size(); i++) { // 每次都调用size()
            System.out.println(list.get(i));
        }

        // 好的做法
        int size = list.size(); // 只计算一次
        for (int i = 0; i < size; i++) {
            System.out.println(list.get(i));
        }

        // 对于ArrayList,使用增强for循环更简洁
        for (String item : list) {
            System.out.println(item);
        }
    }
}

2. 选择合适的循环类型

import java.util.*;

public class LoopSelection {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

        // 需要索引时使用传统for循环
        System.out.println("=== 需要索引 ===");
        for (int i = 0; i < array.length; i++) {
            System.out.println("索引" + i + ":" + array[i]);
        }

        // 只遍历元素时使用增强for循环
        System.out.println("\n=== 只遍历元素 ===");
        for (int value : array) {
            System.out.println("值:" + value);
        }

        // 需要修改集合时避免使用增强for循环
        System.out.println("\n=== 修改集合 ===");
        List<Integer> modifiableList = new ArrayList<>(list);

        // 错误做法(可能抛出ConcurrentModificationException)
        /*
        for (Integer item : modifiableList) {
            if (item % 2 == 0) {
                modifiableList.remove(item); // 危险操作
            }
        }
        */

        // 正确做法
        for (int i = modifiableList.size() - 1; i >= 0; i--) {
            if (modifiableList.get(i) % 2 == 0) {
                modifiableList.remove(i);
            }
        }
        System.out.println("删除偶数后:" + modifiableList);
    }
}

常见错误和注意事项

1. 数组越界

public class ArrayBounds {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};

        // 错误:可能导致数组越界
        /*
        for (int i = 0; i <= array.length; i++) { // 注意:应该是 < 而不是 <=
            System.out.println(array[i]);
        }
        */

        // 正确做法
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }
}

2. 修改循环变量

public class LoopVariableModification {
    public static void main(String[] args) {
        // 小心在循环体内修改循环变量
        System.out.println("=== 修改循环变量示例 ===");
        for (int i = 0; i < 10; i++) {
            System.out.println("i = " + i);
            if (i == 5) {
                i += 2; // 修改循环变量,下次循环i会是8
            }
        }
    }
}

3. 增强for循环的限制

import java.util.*;

public class EnhancedForLimitations {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5};

        // 增强for循环不能修改数组元素
        for (int value : array) {
            value = value * 2; // 这不会改变原数组
        }
        System.out.println("原数组未改变:" + Arrays.toString(array));

        // 需要修改时使用传统for循环
        for (int i = 0; i < array.length; i++) {
            array[i] = array[i] * 2;
        }
        System.out.println("修改后的数组:" + Arrays.toString(array));
    }
}

for循环是Java中最常用的控制结构之一,掌握其各种用法和最佳实践对编写高效的代码非常重要。

powered by Gitbook© 2025 编外计划 | 最后修改: 2025-07-28 16:25:54

results matching ""

    No results matching ""