for 循环(Java)
除了 while 和 do while 循环外,Java 中使用最广泛的是 for 循环。
for 循环功能非常强大,通常通过计数器来控制循环次数,特别适合已知循环次数或需要按索引访问数据的场景。
一、for 循环的执行流程
for 循环的特点是:
- 初始化计数器
- 每次循环前检查条件
- 执行循环体
- 每次循环后更新计数器
计数器变量通常命名为 i。
二、示例:使用 for 循环计算 1 到 100 的和
1 2 3 4 5 6 7 8 9 10
| public class Main { public static void main(String[] args) { int sum = 0; for (int i = 1; i <= 100; i++) { sum = sum + i; } System.out.println(sum); } }
|
执行说明
int i = 1:初始化计数器
i <= 100:循环条件
i++:每次循环后自动更新计数器
与 while 循环相比,for 循环把计数器的初始化、判断和更新集中到一处,代码更加清晰。
三、for 循环的标准结构
1 2 3
| for (初始条件; 循环条件; 循环后更新计数器) { }
|
四、使用 for 循环遍历数组
1 2 3 4 5 6 7 8 9 10 11 12
| public class Main { public static void main(String[] args) { int[] ns = { 1, 4, 9, 16, 25 }; int sum = 0; for (int i = 0; i < ns.length; i++) { System.out.println("i = " + i + ", ns[i] = " + ns[i]); sum = sum + ns[i]; } System.out.println("sum = " + sum); } }
|
关键点
- 数组下标从
0 开始
- 循环条件应为
i < ns.length
- 当
i == ns.length 时循环结束
💡 思考:
如果条件写成 i <= ns.length,会发生什么?
👉 会抛出 ArrayIndexOutOfBoundsException
五、for 循环也可能一次都不执行
- 初始化语句一定会执行
- 如果条件一开始就为
false,循环体不会执行
六、⚠️ 不要在循环体内修改计数器
错误示例
1 2 3 4 5 6 7 8 9 10
| public class Main { public static void main(String[] args) { int[] ns = { 1, 4, 9, 16, 25 }; for (int i = 0; i < ns.length; i++) { System.out.println(ns[i]); i = i + 1; } } }
|
问题分析
for 循环本身会执行 i++
- 循环体内又执行了一次
i = i + 1
- 实际每次循环
i 增加 2
- 导致只打印了一半的元素
📌 结论:
在 for 循环中,不要在循环体内修改计数器!
七、正确控制步长的方式
如果只想访问 偶数索引:
1 2 3 4
| int[] ns = { 1, 4, 9, 16, 25 }; for (int i = 0; i < ns.length; i = i + 2) { System.out.println(ns[i]); }
|
✅ 把步长控制逻辑放在 for 语句中,清晰且安全。
八、计数器变量的作用域(重要)
推荐写法(最佳实践)
1 2 3 4 5
| int[] ns = { 1, 4, 9, 16, 25 }; for (int i = 0; i < ns.length; i++) { System.out.println(ns[i]); }
|
不推荐写法
1 2 3 4 5 6 7
| int[] ns = { 1, 4, 9, 16, 25 }; int i; for (i = 0; i < ns.length; i++) { System.out.println(ns[i]); }
int n = i;
|
📌 原则:
变量的作用域应尽量缩小,避免不必要的误用
九、灵活使用 for 循环
for 循环的三个部分都可以省略:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| for (int i = 0; ; i++) { ... }
for (int i = 0; ;) { ... }
for (;;) { ... }
|
⚠️ 一般不推荐这样写,但在某些特殊场景下可以使用。
十、for each 循环(增强 for)
当我们只关心数组元素的值而不是索引时,可以使用 for each 循环。
示例
1 2 3 4 5 6 7 8 9
| public class Main { public static void main(String[] args) { int[] ns = { 1, 4, 9, 16, 25 }; for (int n : ns) { System.out.println(n); } } }
|
for 与 for each 对比
| 对比项 |
for |
for each |
| 是否有索引 |
有 |
无 |
| 是否可控制顺序 |
可以 |
不可以 |
| 语法简洁性 |
一般 |
更简洁 |
📌 for each 还可用于 List、Map 等可迭代类型。
十一、练习
练习 1:倒序输出数组
1 2 3 4 5 6 7 8 9
| public class Main { public static void main(String[] args) { int[] ns = { 1, 4, 9, 16, 25 }; for (int i = ?; ???; ???) { System.out.println(ns[i]); } } }
|
练习 2:使用 for each 求和
1 2 3 4 5 6 7 8 9 10 11
| public class Main { public static void main(String[] args) { int[] ns = { 1, 4, 9, 16, 25 }; int sum = 0; for (???) { } System.out.println(sum); } }
|
练习 3:使用 for 循环计算 π
公式:
1 2 3 4 5 6 7 8 9 10 11
| π / 4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - ...
public class Main { public static void main(String[] args) { double pi = 0; for (???) { } System.out.println(pi); } }
|
十二、小结
for 循环通过计数器实现复杂循环
for each 循环用于直接遍历元素
- 最佳实践:
- 计数器定义在
for 内部
- 不在循环体中修改计数器
- 合理选择
for 或 for each