第6章 循环让程序重复处理一批数据如果程序只能执行一次逻辑那它能做的事情很有限。真实任务里经常要重复输入多个学生成绩。统计一组订单金额。打印 1 到 100。查找列表中是否有某个用户。一直显示菜单直到用户选择退出。循环就是为了解决“重复执行”。Java 中常见循环for增强forwhiledo while还有两个重要控制语句breakcontinue一、for 循环已知次数时最常用打印 1 到 5for(inti1;i5;i){System.out.println(i);}结构for (初始化; 循环条件; 每轮结束后执行) { 循环体 }执行顺序truefalseint i 1i 5?执行循环体i循环结束i表示每次循环后 i 加 1。常见写法for(inti0;i10;i){System.out.println(i);}从 0 开始非常常见因为数组和集合下标从 0 开始。二、循环变量不是业务数据for(inti0;i5;i){System.out.println(第i次);}这里i是循环变量它控制循环次数。如果你要给用户看“第 1 次、第 2 次”可以输出System.out.println(第(i1)次);不要把下标和业务编号混淆。程序下标从 0 开始人类编号通常从 1 开始。三、求和循环最经典的用途求 1 到 100 的和intsum0;for(inti1;i100;i){sumi;}System.out.println(总和sum);sum i等价于sumsumi;这种变量叫累计变量。循环中常见几类变量计数count求和sum最大值max最小值min是否找到found四、遍历数组int[]scores{90,85,70,60};for(inti0;iscores.length;i){System.out.println(scores[i]);}关键是iscores.length不能写iscores.length因为最后一个下标是scores.length - 1。数组越界会报ArrayIndexOutOfBoundsException这是循环里最常见的错误。五、增强 for只读遍历更清楚int[]scores{90,85,70,60};for(intscore:scores){System.out.println(score);}读法对 scores 里的每一个 score。适合不需要下标。只读取每个元素。做统计、打印、过滤判断。不适合要修改数组某个位置。要使用下标。要倒序遍历。修改数组应该用普通 forfor(inti0;iscores.length;i){scores[i]scores[i]5;}六、while不知道循环次数时使用while的意思是只要条件成立就一直执行。intcount3;while(count0){System.out.println(倒计时count);count--;}适合菜单一直显示直到用户退出。用户输入不合法就继续要求输入。读取文件直到结束。等待某个条件发生。死循环示例intcount3;while(count0){System.out.println(count);}count 没有变化条件永远为 true。写 while 时必须问循环条件什么时候会变成 false七、do while至少执行一次intcount0;do{System.out.println(至少执行一次);count;}while(count1);do while先执行再判断。它适合菜单intcommand;do{System.out.println(1. 查询);System.out.println(2. 添加);System.out.println(0. 退出);command0;}while(command!0);实际项目里for和while更常见但do while对交互菜单很直观。八、break提前结束循环查找第一个及格分数int[]scores{30,45,59,61,80};for(intscore:scores){if(score60){System.out.println(找到及格分数score);break;}}break会直接结束整个循环。适合找到目标后停止。用户选择退出。遇到无法继续的错误。不要滥用 break。如果循环里有很多 break说明流程可能需要拆方法。九、continue跳过本轮打印所有及格分数int[]scores{30,80,50,90};for(intscore:scores){if(score60){continue;}System.out.println(及格score);}continue表示跳过本轮后面的代码直接进入下一轮。适合过滤无效数据String[]names{Tom,,null,Jack};for(Stringname:names){if(namenull||name.isEmpty()){continue;}System.out.println(有效姓名name);}这样主逻辑不会被包在很深的 if 里。十、嵌套循环打印乘法表for(introw1;row9;row){for(intcol1;colrow;col){System.out.print(colxrow(col*row)\t);}System.out.println();}外层控制行内层控制列。嵌套循环适合二维表格。矩阵。两两比较。多层分类。但嵌套循环成本高。两个 10000 长度的数据双层循环就是一亿次比较。以后学集合和算法时会继续讲优化。十一、循环实战统计成绩publicclassScoreLoopDemo{publicstaticvoidmain(String[]args){int[]scores{90,85,-1,70,120,60,45};intmax0;intmin100;intsum0;intvalidCount0;intpassCount0;for(intscore:scores){if(score0||score100){System.out.println(忽略非法分数score);continue;}if(scoremax){maxscore;}if(scoremin){minscore;}if(score60){passCount;}sumscore;validCount;}if(validCount0){System.out.println(没有有效分数);return;}doubleaveragesum*1.0/validCount;System.out.println(最高分max);System.out.println(最低分min);System.out.println(平均分average);System.out.println(及格人数passCount);}}这里用到了增强 for 遍历。continue 忽略非法数据。max/min/sum/count 累计。计算平均值时避免整数除法。没有有效数据时提前 return。十二、循环实战菜单重复显示importjava.util.Scanner;publicclassMenuDemo{publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);intcommand;do{System.out.println( 菜单 );System.out.println(1. 查询余额);System.out.println(2. 充值);System.out.println(3. 消费);System.out.println(0. 退出);System.out.print(请选择);commandscanner.nextInt();switch(command){case1:System.out.println(余额100元);break;case2:System.out.println(执行充值);break;case3:System.out.println(执行消费);break;case0:System.out.println(退出程序);break;default:System.out.println(未知命令);break;}}while(command!0);}}这个例子是命令行程序的常见结构菜单、输入、switch、循环。后面阶段项目会继续使用这种结构。十三、常见错误1. 循环条件永远成立while(true){System.out.println(停不下来);}有时你确实需要无限循环但必须有 break 或外部退出条件。2. 数组越界for(inti0;iscores.length;i){System.out.println(scores[i]);}应写 scores.length。3. 累计变量放错位置for(intscore:scores){intsum0;sumscore;}sum 每轮都重新变成 0。应放在循环外。4. continue 后面代码不执行写 continue 前要确认本轮后续逻辑确实应该跳过。5. 嵌套循环变量混乱外层用 row内层用 col不要都叫 i。十四、本章练习用 for 打印 1 到 100。计算 1 到 100 的和。打印 1 到 100 中所有偶数。给定数组int[]numbers{3,9,2,8,6,1};找出最大值和最小值。写一个菜单程序支持1. 打招呼 2. 显示时间占位文案 0. 退出打印九九乘法表。十五、本章总结循环用来重复执行逻辑。你需要掌握for 适合已知次数。增强 for 适合只读遍历。while 适合未知次数。do while 至少执行一次。break 结束循环。continue 跳过本轮。循环中常用 count、sum、max、min、found。数组遍历条件通常是i array.length。累计变量要放在循环外。嵌套循环要注意可读性和性能。下一章讲方法。方法会让我们把循环、条件、输入输出拆成更清晰的小块为阶段项目做准备。