Java For 循环全解析:从基础到增强的实战指南
Java For 循环全解析:从基础到增强的实战指南
一、For 循环:Java 流程控制的核心组件
虽然所有循环结构都可以用 while 或者 do…while表示,但 Java 提供了另一种语句——for循环,使一些循环结构变得更加简单。
for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。For 循环具有以下特性:
- 确定循环次数的首选
- 支持复杂的循环控制逻辑
- 配合增强语法简化集合遍历
本文将整合课程内容,深度解析 For 循环的底层原理与实践技巧。
二、传统 For 循环详解
1. 基础语法
for循环执行的次数是在执行前就确定的。
for (初始化; 条件; 更新) {
// 循环体
}
2. 执行流程
初始化 → 条件判断 → 执行循环体 → 更新 → 条件判断 → ...
最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。
然后,检测布尔表达式的值。如果为 true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句。
执行一次循环后,更新循环控制变量(迭代因子控制循环变量的增减)。
再次检测布尔表达式。循环执行上面的过程。
3. 示例代码
package struct;
public class ForDemo01 {
public static void main(String[] args) {
int a =1;//初始化条件
while(a <= 100){//条件判断
System.out.println(a);///循环体
a += 2;//迭代
}
System.out.println("while循环结束");
//初始化//条件判断//迭代
for (int i = 1;i <= 100;i++){
System.out.println(i);
}
System.out.println("for循环结束");
}
}
注意事项:
- 初始化、条件、更新均可省略,但分号不可省略
- 无限循环写法:
for (;;) { ... }
三、随堂练习
1. 练习1:计算0到100之间的奇数和偶数的和
package struct;
public class ForDemo02 {
public static void main(String[] args) {
int oddsum = 0;
int evensum = 0;
for (int i = 0; i <= 100; i++) {
if (i % 2 != 0) {
oddsum += i;
}else {
evensum += i;
}
}
System.out.println("奇数的和=" + oddsum);
System.out.println("偶数的和=" + evensum);
}
}
2. 练习2:用while或for循环输出1-1000之间能被5整除的数,并且每行输出3个
package struct;
public class ForDemo03 {
public static void main(String[] args) {
//练习2:用while或for循环输出1-1000之间能被5整除的数,并且每行输出3个
for (int i = 1; i <= 1000; i++) {
if (i % 5 == 0) {
System.out.print(i+"\t");
}
if (i % (5*3) == 0) {
System.out.println();//System.out.print("\n")
}
}
/*
println:输出完会换行
print:输出玩不会换行
*/
}
}
3.练习3:打印九九乘法表
package struct;
public class ForDemo04 {
public static void main(String[] args) {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(i+"*"+j+"="+(i*j)+"\t");
}
System.out.println();
}
}
}
四、增强 For 循环
这里我们先只是见一面,做个了解,之后数组我们重点使用。
Java5 引入了一种主要用于数组或集合的增强型for循环。
1. 语法格式
for (元素类型 变量 : 集合/数组) {
// 操作变量
}
for(声明语句 : 表达式){
//代码语句
}
- 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
- 表达式:表达式是要访问的数组名,或者是返回值为数组的方法。
2. 适用场景
// 遍历数组
int[] nums = {1, 2, 3};
for (int num : nums) {
System.out.println(num);
}
// 遍历集合
List<String> names = Arrays.asList("张三", "李四");
for (String name : names) {
System.out.println(name);
}
局限性:
- 无法获取当前索引
- 遍历过程中不能修改集合(会抛出
ConcurrentModificationException
)
五、For 循环对比与选择策略
1. 传统 For vs 增强 For
维度 | 传统 For 循环 | 增强 For 循环 |
---|---|---|
适用场景 | 需要索引或复杂控制 | 简单遍历 |
性能 | 稍高(直接索引访问) | 稍低(迭代器实现) |
可读性 | 适合复杂逻辑 | 代码简洁 |
2. 循环结构选择矩阵
场景 | 推荐结构 | 示例代码 |
---|---|---|
确定次数的循环 | For 循环 | for (int i=0; i<10; i++) |
遍历集合 / 数组 | 增强 For 循环 | for (String s : list) |
不确定次数的循环 | While 循环 | while (condition) |
至少执行一次的循环 | Do-While 循环 | do { … } while (condition) |
六、常见错误与解决方案
1. 无限循环
错误示例:
for (int i = 0; i < 10; ) { // 缺少i++导致无限循环⚠️
System.out.println(i);
}
解决方案:
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
2. 索引越界
错误示例:
int[] arr = {1, 2, 3};
for (int i = 0; i <= arr.length; i++) { // 应为i < arr.length⚠️
System.out.println(arr[i]);
}
3. 并发修改异常
错误示例:
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
for (int num : list) {
if (num == 2) {
list.remove(num); // 抛出ConcurrentModificationException⚠️
}
}
解决方案:
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
int num = iterator.next();
if (num == 2) {
iterator.remove();
}
}
七、最佳实践总结
-
优先使用增强 For 循环:
// 推荐做法 for (User user : userList) { process(user); }
-
避免多层嵌套:
// 反模式 for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { ... } } // 推荐做法 for (int i = 0; i < 10; i++) { processRow(i); }
-
明确循环变量作用域:
// 推荐做法 for (int i = 0; i < 10; i++) { // 作用域仅限于循环 System.out.println(i); }
八、高频面试题解析
1. For 循环的初始化可以省略吗?
-
可以省略,但需确保条件和更新部分正确
-
示例:
int i = 0; for (; i < 10; i++) { ... }
2. 增强 For 循环的底层实现?
-
基于
Iterator
接口实现 -
反编译代码示例:
Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String element = iterator.next(); // 循环体 }
九、学习资源推荐
- Java For 循环官方文档
- 狂神说 Java 课程
- 阿里巴巴 Java 开发手册
十、总结与互动
通过本文的学习,您将掌握:
- 传统 For 循环的三种核心用法
- 嵌套循环的优化技巧
- 增强 For 循环的适用场景
- 循环结构的选择策略
疑问引导:您在使用 For 循环时遇到过哪些难以解决的问题?例如:
- 嵌套循环导致的性能问题?
- 并发修改异常的排查?
欢迎在评论区分享您的解决方案!