在 Java 编程中,循环(Loop)是控制语句的重要组成部分,用于重复执行一段代码。合理使用循环可以大幅减少重复代码,提高程序的可读性和维护性。Java 提供了三种基本循环结构: for 、 while 、 do-while ,以及在集合和数组遍历中常用的“增强 for 循环”(for-each)。下面分别从语法、执行流程、适用场景和常见注意事项展开说明。
一、for 循环
1. 基本语法
java
for (初始化表达式; 条件表达式; 更新表达式) {
// 循环体
}
- 初始化表达式:在循环开始前执行一次,通常用于声明和初始化循环变量,例如 int i = 0 。
- 条件表达式:每次循环开始前判断,结果为 true 才执行循环体,否则退出循环。
- 更新表达式:每次循环体执行完后执行,通常用于更新循环变量,例如 i++ 。
2. 执行流程
1. 执行初始化表达式。
2. 判断条件表达式:
- 若为 true ,执行循环体;
- 若为 false ,结束循环。
3. 循环体执行完后,执行更新表达式。
4. 回到第 2 步,重复判断。
3. 示例:遍历数组
java
int[] numbers = {1, 2, 3, 4, 5};
for (int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i]);
}
4. 常见变体
- 省略初始化、条件或更新表达式(但分号不能省略):
java
int i = 0;
for (; i < 10; ) {
System.out.println(i);
i++;
}
- 无限循环(条件恒为 true ):
java
for (;;) {
// 需要在循环体内通过 break 退出
}
二、while 循环
1. 基本语法
java
while (条件表达式) {
// 循环体
}
2. 执行流程
1. 判断条件表达式。
2. 若为 true ,执行循环体,然后回到第 1 步。
3. 若为 false ,结束循环。
3. 示例:读取用户输入直到输入 0
java
Scanner scanner = new Scanner(System.in);
int x;
while ((x = scanner.nextInt()) != 0) {
System.out.println("你输入了:" + x);
}
4. 与 for 循环的对比
- while 更适合“不确定循环次数”的场景,只知道结束条件。
- for 更适合“已知循环次数或遍历范围”的场景,如数组、集合的索引遍历。
三、do-while 循环
1. 基本语法
java
do {
// 循环体
} while (条件表达式);
2. 执行流程
1. 先执行一次循环体。
2. 再判断条件表达式:
- 若为 true ,回到第 1 步继续执行;
- 若为 false ,结束循环。
3. 特点
- 至少执行一次循环体,即使条件一开始就为 false 。
- 适用于“必须先执行一次,再根据结果决定是否继续”的场景,如菜单选择、输入校验等。
4. 示例:菜单循环
java
Scanner scanner = new Scanner(System.in);
int choice;
do {
System.out.println("1. 新增");
System.out.println("2. 删除");
System.out.println("0. 退出");
System.out.print("请选择:");
choice = scanner.nextInt();
// 根据 choice 处理业务逻辑
} while (choice != 0);
四、增强 for 循环(for-each)
1. 基本语法
java
for (元素类型 变量名 : 数组或 Iterable 对象) {
// 循环体
}
2. 适用范围
- 数组: int[] 、 String[] 等。
- 实现了 Iterable 接口的集合类: List 、 Set 等。
3. 示例:遍历 List
java
List<String> list = Arrays.asList("A", "B", "C");
for (String s : list) {
System.out.println(s);
}
4. 优点与局限
- 优点:
- 语法简洁,可读性好。
- 不需要手动管理索引,减少数组越界错误。
- 局限:
- 无法直接获取当前索引(如需索引,仍需使用普通 for 循环或手动维护计数器)。
- 不适合在循环中修改集合结构(如增删元素),否则可能抛出 ConcurrentModificationException 。
五、循环控制语句:break 与 continue
1. break
- 作用:立即终止当前所在的循环或 switch 语句。
- 示例:找到第一个偶数就退出循环
java
int[] numbers = {1, 3, 5, 4, 7};
for (int x : numbers) {
if (x % 2 == 0) {
System.out.println("找到第一个偶数:" + x);
break;
}
}
2. continue
- 作用:跳过本次循环剩余部分,直接进入下一次循环。
- 示例:只打印奇数
java
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue;
}
System.out.println(i);
}
3. 带标签的 break / continue(了解)
- 可以跳出或跳过嵌套循环中的外层循环。
java
outer:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == 1 && j == 1) {
break outer; // 跳出外层循环
}
System.out.println(i + "," + j);
}
}
六、循环常见问题与最佳实践
1. 避免死循环
- 死循环示例:
java
while (true) {
// 没有退出条件
}
for (int i = 0; i < 10; ) {
System.out.println(i);
// 忘记 i++
}
- 避免方法:
- 确保条件表达式最终会变为 false 。
- 循环变量更新逻辑正确。
- 在复杂循环中加入调试输出或日志,观察循环变量变化。
2. 循环变量的作用域
- 在 for 循环中声明的变量只在循环体内有效:
java
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
// System.out.println(i); // 编译错误,i 未定义
- 如需在循环外使用该变量,应在循环外声明。
3. 性能与可读性平衡
- 对于简单遍历,优先使用增强 for 循环。
- 对于需要索引、复杂条件或性能敏感场景,使用普通 for 循环。
- 避免过深的嵌套循环(一般建议不超过 3 层),可通过抽取方法、拆分逻辑来优化。
七、小结
- Java 提供了 for 、 while 、 do-while 三种基本循环结构,以及增强 for 循环用于遍历。
- for 适合已知次数或范围的循环; while 适合条件控制的循环; do-while 适合至少执行一次的场景。
- break 用于终止循环, continue 用于跳过本次循环。
- 使用循环时要注意避免死循环、合理控制循环变量的作用域,并在性能与可读性之间做平衡。
掌握这些循环相关的知识点,是编写清晰、高效 Java 代码的基础。


被折叠的 条评论
为什么被折叠?



