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);
}