经典的三段式 for 循环
for 循环把一段代码重复执行受控的次数。Java 的写法在括号里放了三样东西,用分号隔开:
这三部分按固定的节奏运行:
- 初始化(
int i = 0):最先运行,只运行一次。 - 条件(
i < 5):每一轮之前检查;为 false 时循环停止。 - 更新(
i++):每一轮之后运行,然后再次检查条件。
所以这段代码打印 i = 0 到 i = 4。计数器 i 的作用域仅限于循环内部,右花括号之后它就不存在了。
递增、递减和按步长计数
这三部分让你完全掌控计数器:
i-- 递减,i += 5 每次跳五,它们都是负责计数运算的算术运算符。条件决定了按方向停止的时机:倒数时用 >,正数时用 < 或 <=。
遍历数组
计数循环和数组是天然的搭档,用 .length 作为上限,用 i 作为索引:
注意 colors.length 是一个字段,没有括号,数组在这一点上比较特殊。List 则用 list.size()。条件 i < colors.length 是正确的:索引从 0 到 length - 1,所以用 <(而不是 <=)可以避免越界错误。
增强 for-each 循环
当你只需要每个元素、从不需要索引时,增强 for 更简洁,也更不容易写错,因为没有计数器,也就不会差一:
for (String color : colors) 可以读作“对 colors 中的每个 color”。它适用于数组和任何可迭代对象。代价是:你没有索引,而且在循环中不能向集合添加或删除元素(那样会抛出一个运行时异常 ConcurrentModificationException)。需要这两者之一时,就用计数循环。
嵌套循环
循环里面套循环,适合处理网格、表格和配对。外层每走一轮,内层都会完整地跑一遍:
这段代码打印出一个 3x3 的乘法表。一旦嵌套变深,就给计数器起有意义的名字(row、col),而不是 i、j,这样就不会搞混谁是谁。
break 和 continue
break 立即跳出循环。continue 跳过本轮剩下的部分,直接进入更新步骤:
这段代码打印 1 3 5 7。continue 跳过偶数;当 i 将要超过 7 时,break 结束循环。在嵌套循环中,除非使用带标签的 break,否则两者都只影响最内层的循环。
小心死循环
如果条件永远不会变成 false,循环就会一直运行下去。常见原因是忘了写更新,或者计数器往错误的方向走:
for (int i = 0; i < 5; i--) { // i only ever decreases -> never reaches 5
System.out.println(i);
}
有意写的无限循环会省略全部三部分:for (;;) { ... },并依靠内部的 break 来停止。请谨慎使用这种写法;while (true) 通常读起来更清楚。
下一篇:while 循环
当你事先就知道计数器时,for 循环最好用。当你想一直循环到某个条件改变、又没有一个清晰的计数器时,while 循环更合适。这就是下一篇的内容。
常见问题
Java 中 for 循环的语法是什么?
Java 的 for 循环在括号里有三部分,用分号隔开:for (initialization; condition; update) { ... }。例如 for (int i = 0; i < 5; i++) { ... } 让 i 从 0 开始,在 i < 5 时执行循环体,并在每一轮结束后给 i 加 1。这三部分都可以省略。
Java 中 for 循环和 for-each 循环有什么区别?
经典的 for 循环使用显式计数器,所以索引和方向都由你控制,适合需要索引或想跳过元素的时候。增强 for-each 循环 for (Type item : collection) 不用索引,按顺序遍历每个元素,当你只需要每个元素、从不需要位置时更简洁。for-each 在循环过程中不能修改集合的结构。
Java 中如何遍历数组?
要么用计数循环按索引访问:for (int i = 0; i < arr.length; i++) { use arr[i]; };要么在不需要索引时用 for-each:for (int x : arr) { use x; }。数组通过 .length 字段(没有括号)给出大小,而列表用 .size()。