Java循环结构全解析:从基础用法到性能优化(含经典案例)
- Java循环结构全解析:从基础用法到性能优化(含经典案例)
-
- 一、循环结构的核心作用与分类
-
- [1. 核心作用](#1. 核心作用)
- [2. 分类](#2. 分类)
- 二、四大循环结构的基础语法与经典案例
-
- [1. for循环:已知次数的精准循环](#1. for循环:已知次数的精准循环)
- [2. while循环:未知次数的条件循环](#2. while循环:未知次数的条件循环)
- [3. do-while循环:至少执行一次的循环](#3. do-while循环:至少执行一次的循环)
- [4. 增强型for循环(for-each):简洁的集合遍历](#4. 增强型for循环(for-each):简洁的集合遍历)
- 三、循环结构的核心差异与选择指南
-
- [1. 核心差异对比](#1. 核心差异对比)
- [2. 选择指南](#2. 选择指南)
- 四、循环中的关键操作:break、continue、return
-
- [1. break:终止当前循环](#1. break:终止当前循环)
- [2. continue:跳过本次循环](#2. continue:跳过本次循环)
- 五、循环性能优化技巧
- 六、常见循环错误与避坑指南
- 七、总结
本文收录于《 零基础入门Java·基础篇 学习大纲》
Java循环结构全解析:从基础用法到性能优化(含经典案例)
在Java编程中,循环结构是实现重复执行代码块的核心技术,也是处理批量数据、迭代逻辑的基础。无论是简单的次数循环、条件循环,还是集合迭代,掌握不同循环结构的适用场景和优化技巧,能显著提升代码的效率和可读性。本文将结合直角三角形打印 、乘法口诀表生成等经典案例,全面拆解Java中的循环结构。
一、循环结构的核心作用与分类
1. 核心作用
循环结构的本质是重复执行一段代码块,直到满足终止条件。其核心价值在于:
- 减少重复代码(如批量处理1000条数据无需写1000行重复逻辑);
- 处理不确定次数的逻辑(如用户输入验证,直到输入合法才继续);
- 迭代数据集合(如遍历数组、集合中的元素)。
2. 分类
Java提供4种常用循环结构,适用于不同场景:
| 循环类型 | 核心特点 | 适用场景 |
|---|---|---|
| for循环 | 初始化、循环条件、迭代器分离,结构清晰 | 已知循环次数(如遍历数组、固定次数循环) |
| while循环 | 先判断条件再执行,条件不满足则一次不执行 | 未知循环次数(如依赖外部状态的循环) |
| do-while循环 | 先执行一次再判断条件,至少执行一次 | 必须执行一次的场景(如菜单交互、输入验证) |
| 增强型for循环 | 语法简洁,无需索引,直接遍历元素 | 遍历数组、集合(Collection),无需操作索引 |
二、四大循环结构的基础语法与经典案例
1. for循环:已知次数的精准循环
语法结构
java
for (初始化表达式; 循环条件表达式; 迭代表达式) {
// 循环体:需要重复执行的代码
}
经典案例1:打印直角三角形(嵌套for循环)
直角三角形的打印需要控制每行的星号数量随行数递增,适合用嵌套for循环实现(外层控制行数,内层控制每行的星号数)。
java
public class RightTriangle {
public static void main(String[] args) {
int rows = 5; // 三角形的行数
// 外层循环:控制行数(从1到rows)
for (int i = 1; i <= rows; i++) {
// 内层循环:控制每行的星号数量(第i行打印i个星号)
for (int j = 1; j <= i; j++) {
System.out.print("* ");
}
// 每行结束后换行
System.out.println();
}
}
}
运行结果
*
* *
* * *
* * * *
* * * * *
经典案例2:生成乘法口诀表(双层for循环)
乘法口诀表是典型的行列关联场景,外层循环控制行数(乘数1),内层循环控制列数(乘数2),且列数不超过行数(避免重复计算)。
java
public class MultiplicationTable {
public static void main(String[] args) {
// 外层循环:控制行数(乘数i从1到9)
for (int i = 1; i <= 9; i++) {
// 内层循环:控制列数(乘数j从1到i,避免重复)
for (int j = 1; j <= i; j++) {
System.out.print(j + "×" + i + "=" + (j*i) + "\t");
}
// 每行结束后换行
System.out.println();
}
}
}
运行结果
1×1=1
1×2=2 2×2=4
1×3=3 2×3=6 3×3=9
1×4=4 2×4=8 3×4=12 4×4=16
1×5=5 2×5=10 3×5=15 4×5=20 5×5=25
1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36
1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49
1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64
1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81
2. while循环:未知次数的条件循环
语法结构
java
初始化表达式;
while (循环条件表达式) {
// 循环体
迭代表达式;
}
实例:用户输入验证(未知输入次数)
java
import java.util.Scanner;
public class WhileLoopDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int password;
// 循环直到输入正确的密码(123456)
while (true) {
System.out.print("请输入密码:");
password = scanner.nextInt();
if (password == 123456) {
System.out.println("密码正确,登录成功!");
break; // 满足条件,退出循环
} else {
System.out.println("密码错误,请重新输入!");
}
}
scanner.close();
}
}
3. do-while循环:至少执行一次的循环
语法结构
java
初始化表达式;
do {
// 循环体
迭代表达式;
} while (循环条件表达式);
实例:菜单交互(必须显示一次菜单)
java
import java.util.Scanner;
public class DoWhileLoopDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int choice;
do {
// 显示菜单(至少显示一次)
System.out.println("\n===== 功能菜单 =====");
System.out.println("1. 打印直角三角形");
System.out.println("2. 生成乘法口诀表");
System.out.println("3. 退出");
System.out.print("请选择功能(1-3):");
choice = scanner.nextInt();
// 根据选择执行对应功能
switch (choice) {
case 1:
printTriangle(5); // 调用直角三角形打印方法
break;
case 2:
printMultiplicationTable(); // 调用乘法口诀表方法
break;
case 3:
System.out.println("退出系统,再见!");
break;
default:
System.out.println("输入错误,请重新选择!");
}
} while (choice != 3); // 选择3则退出循环
scanner.close();
}
// 封装直角三角形打印方法
private static void printTriangle(int rows) {
for (int i = 1; i <= rows; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("* ");
}
System.out.println();
}
}
// 封装乘法口诀表方法
private static void printMultiplicationTable() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "×" + i + "=" + (j*i) + "\t");
}
System.out.println();
}
}
}
4. 增强型for循环(for-each):简洁的集合遍历
语法结构
java
for (元素类型 变量名 : 可迭代对象) {
// 循环体:变量名直接引用集合中的元素
}
实例:遍历数组与集合
java
import java.util.ArrayList;
import java.util.List;
public class ForEachDemo {
public static void main(String[] args) {
// 遍历数组
int[] nums = {1, 3, 5, 7, 9};
System.out.println("数组元素:");
for (int num : nums) {
System.out.print(num + " ");
}
// 遍历集合
List<String> fruits = new ArrayList<>();
fruits.add("苹果");
fruits.add("香蕉");
fruits.add("橙子");
System.out.println("\n水果列表:");
for (String fruit : fruits) {
System.out.print(fruit + " ");
}
}
}
三、循环结构的核心差异与选择指南
1. 核心差异对比
| 对比维度 | for循环 | while循环 | do-while循环 | 增强型for循环 |
|---|---|---|---|---|
| 执行顺序 | 先判断,后执行 | 先判断,后执行 | 先执行,后判断 | 先迭代,后执行 |
| 循环次数确定性 | 已知次数(推荐) | 未知次数(推荐) | 至少执行一次(推荐) | 遍历集合/数组(推荐) |
| 典型案例 | 直角三角形、乘法表 | 用户输入验证 | 菜单交互 | 数组/集合遍历 |
2. 选择指南
- 若明确知道循环次数(如打印5行三角形、9行乘法表)→ 用
for循环; - 若循环次数依赖外部条件(如用户输入密码的次数)→ 用
while循环; - 若必须执行一次循环体(如显示菜单后再判断是否退出)→ 用
do-while循环; - 若仅需遍历集合/数组,无需操作索引 → 用
增强型for循环(代码更简洁)。
四、循环中的关键操作:break、continue、return
1. break:终止当前循环
例如在乘法口诀表中,若只想打印前5行:
java
for (int i = 1; i <= 9; i++) {
if (i > 5) break; // 行数超过5则终止循环
for (int j = 1; j <= i; j++) {
System.out.print(j + "×" + i + "=" + (j*i) + "\t");
}
System.out.println();
}
2. continue:跳过本次循环
例如在直角三角形中,第3行不打印:
java
int rows = 5;
for (int i = 1; i <= rows; i++) {
if (i == 3) continue; // 跳过第3行
for (int j = 1; j <= i; j++) {
System.out.print("* ");
}
System.out.println();
}
五、循环性能优化技巧
- 避免循环内创建对象 :将对象创建移到循环外(如
StringBuilder复用); - 减少循环内的计算量 :缓存集合长度(如
int size = list.size()); - 优化嵌套循环 :乘法口诀表中通过
j <= i减少内层循环次数,避免冗余计算; - 利用并行流 :大数据量循环时,用
parallelStream()利用多核CPU加速。
六、常见循环错误与避坑指南
- 死循环 :确保循环条件最终会变为
false(如乘法表中i从1增至9后退出); - 索引越界 :数组遍历用
i < array.length而非i <= array.length; - 增强型for循环修改集合:遍历集合时添加/删除元素会报错,需用迭代器。
七、总结
循环结构是Java编程的基础,通过本文的直角三角形、乘法口诀表等案例可以看出:
for循环适合控制固定次数的嵌套逻辑(如行列关联的图形或表格);while和do-while适合依赖外部条件的场景(如交互逻辑);- 增强型for循环简化了集合遍历的代码;
- 合理使用
break和continue能让循环逻辑更清晰。
若有转载,请标明出处:https://blog.csdn.net/CharlesYuangc/article/details/153798540