摘要本文系统讲解了 Java 中循环结构的核心概念与使用方法涵盖while、do-while、for及增强for循环的语法、执行流程和适用场景并深入介绍了break、continue控制语句、循环嵌套以及常见陷阱。通过丰富的代码示例和综合的猜数字游戏实战帮助初学者快速掌握循环这一实现代码重复执行的关键技术为后续学习打下坚实基础。关键词Java 循环, while 循环, for 循环, break 和 continue, 循环嵌套我们学会了变量来存储数据学会了运算符来处理数据还学会了条件判断来让程序做决策。但你会发现如果程序只会从上到下执行一次那么很多事情都做不了。比如你想打印 100 遍“我爱你”难道要写 100 行System.out.println(我爱你);吗当然不是。如果让你计算 1 到 100 的总和难道要写123...100吗那样既不现实也毫无意义。我们需要一种能力让一段代码重复执行多次直到某个条件不再满足为止。这就是循环Loop。循环是程序设计中最重要的控制结构之一它让程序具备了“批量处理”的能力。Java 提供了三种循环结构while、do-while和for。另外还有一种专门遍历集合的“增强 for 循环”for-each。我们来逐一认识它们。1.while循环 —— 先判断再执行while循环是最基本的一种。它的语法是while(条件){// 循环体当条件为 true 时重复执行这里的代码}执行流程很简单判断条件是否为true。如果是执行一次循环体。执行完后再回到第 1 步继续判断。如果条件为false跳出循环继续执行后面的代码。如果条件一开始就是false循环体一次都不会执行。看一个经典例子打印 1 到 5 的数字。inti1;// 初始化计数器while(i5){// 条件i 小于等于 5System.out.println(i);i;// 更新计数器否则会死循环}System.out.println(循环结束);输出1 2 3 4 5 循环结束这里我们用了三个要素初始化int i 1;条件i 5更新i缺少任何一个循环都可能出问题。尤其是如果忘了i条件永远为真程序会一直打印 1直到你强行终止它——这就是死循环无限循环。写循环时一定要确保条件最终会变为false。while常用于“不确定次数”的循环比如你让用户输入一个正数如果输入的不是正数就一直提示重新输入。你事先不知道用户会输错多少次但循环可以一直问下去。ScannerscannernewScanner(System.in);intnumber;System.out.print(请输入一个正数);numberscanner.nextInt();while(number0){System.out.print(输入无效请重新输入一个正数);numberscanner.nextInt();}System.out.println(你输入了number);2.do-while循环 —— 先执行再判断do-while和while非常相似唯一的不同是do-while先执行一次循环体然后再判断条件。所以至少会执行一次。语法do{// 循环体}while(条件);注意最后有一个分号;别漏掉。把上面的“输入正数”的例子用do-while改写会更自然因为我们至少需要询问一次。ScannerscannernewScanner(System.in);intnumber;do{System.out.print(请输入一个正数);numberscanner.nextInt();}while(number0);System.out.println(你输入了number);这样写代码更紧凑不需要在循环前重复写一次输入语句了。什么时候用while什么时候用do-while如果可能一次都不执行用while。如果至少需要执行一次比如菜单交互、输入验证用do-while。3.for循环 —— 计数循环的“集大成者”for循环是最常用的循环结构尤其适合已知循环次数的场景。它把“初始化”、“条件”、“更新”三个要素整齐地写在一行结构清晰。语法for(初始化;条件;更新){// 循环体}执行顺序执行初始化只执行一次。判断条件如果为true则继续为false则退出。执行循环体。执行更新。回到第 2 步。看一个打印 1 到 5 的例子for(inti1;i5;i){System.out.println(i);}输出一样。这里int i 1只在循环开始时执行一次i在每次循环体执行完后执行。变量i的作用域仅限于for循环内部循环结束后i就不可用了除非你在外部提前定义。更复杂的for用法可以初始化多个变量用逗号分隔但类型必须相同。更新部分也可以多条语句用逗号分隔。三个部分都可以省略但分号不能省。比如for (;;)就是一个死循环相当于while(true)。// 同时初始化 i 和 jfor(inti0,j10;ij;i,j--){System.out.println(ii, jj);}// 输出i0, j10; i1, j9; i2, j8; i3, j7; i4, j6计算 1 到 100 的总和intsum0;for(inti1;i100;i){sumi;// sum sum i}System.out.println(1到100的总和是sum);// 50504. 增强for循环for-each —— 专为遍历而生在 JDK 5 中引入了一种更简洁的循环形式专门用来遍历数组或集合我们后面会详细学。它不需要索引也不需要手动维护计数器语法简单for(元素类型 变量名:数组或集合){// 循环体}比如遍历一个整数数组int[]numbers{10,20,30,40,50};for(intnum:numbers){System.out.println(num);}它会依次把数组中的每个元素赋值给num然后执行循环体。你不用关心索引也不用担心越界。不过增强 for 循环不能修改数组/集合的元素因为它拿到的只是一个副本而且在需要索引的情况下比如要修改某个位置的值也不适用此时还得用普通的for。我们在第四阶段学习集合时会大量使用增强 for现在先留个印象。5.break和continue—— 跳出或跳过在循环体中有时我们需要提前结束循环或者跳过当前这次迭代进入下一次。这时就需要break和continue。break立即终止整个循环跳出循环体执行循环后面的代码。continue立即结束本次迭代跳过本轮循环体中剩余的代码直接进入下一次迭代对于for循环会先执行更新部分再判断条件。// break 示例找到第一个能被 7 整除的数for(inti1;i100;i){if(i%70){System.out.println(第一个能被7整除的数是i);break;// 找到就跳出循环}}// 输出 7// continue 示例打印 1 到 10 之间的奇数for(inti1;i10;i){if(i%20){continue;// 偶数跳过不打印}System.out.println(i);}// 输出 1,3,5,7,9带标签的break和continue了解即可在嵌套循环中break默认只跳出当前最内层循环。如果你想从内层循环直接跳出外层循环可以使用标签labelouter:// 标签后面跟冒号for(inti0;i3;i){for(intj0;j3;j){if(i1j1){breakouter;// 直接跳出外层循环}System.out.println(ii, jj);}}// 只会打印 i0,j0; i0,j1; i0,j2; i1,j0虽然带标签的break有用但过多的嵌套和跳转会降低代码可读性。一般尽量通过设计循环条件来避免复杂跳转。6. 循环嵌套 —— 循环里面套循环一个循环的循环体内包含另一个循环这叫嵌套循环。最常见的场景是打印二维图形、处理矩阵等。比如打印一个 5 行 5 列的星号矩形for(introw1;row5;row){for(intcol1;col5;col){System.out.print(* );}System.out.println();// 每行结束换行}输出* * * * * * * * * * * * * * * * * * * * * * * * *稍微改一下打印一个直角三角形for(introw1;row5;row){for(intcol1;colrow;col){System.out.print(* );}System.out.println();}输出* * * * * * * * * * * * * * *嵌套循环时外层循环控制“行数”或“轮数”内层循环控制“每行的细节”。理解这个层次关系是关键。7. 循环中的常见陷阱死循环条件永远为真。比如while (true)或for (;;)或者忘了更新变量。一定要确保循环能结束。差一错误Off-by-one循环条件中的和搞混导致多一次或少一次。比如要循环 5 次用i 50~4还是i 50~5要清楚。在循环内改变循环变量的值如果不小心在循环体里修改了循环变量可能导致意外行为。break和continue的滥用它们会让代码逻辑变得不那么直观尽量用循环条件本身来控制流程而不是依赖跳转。8. 综合示例 —— 猜数字游戏我们把今天学的循环和条件判断结合起来写一个有趣的“猜数字”游戏程序随机生成一个 1~100 的整数用户输入猜测程序提示“大了”或“小了”直到猜中为止并统计猜的次数。packagecom.example.demo;importjava.util.Scanner;importjava.util.Random;// Random 类用于生成随机数/** * 猜数字游戏演示 while 循环、break、条件判断 */publicclassGuessNumber{publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);RandomrandomnewRandom();// 生成 1~100 的随机整数inttargetrandom.nextInt(100)1;// nextInt(100) 返回 0~991 变成 1~100intguess;intattempts0;booleanguessedfalse;System.out.println( 猜数字游戏 );System.out.println(我已经想好了一个 1~100 之间的整数猜猜看吧);// 使用 while 循环直到猜对为止while(!guessed){System.out.print(请输入你的猜测);guessscanner.nextInt();attempts;if(guesstarget){System.out.println(太小了再大一点);}elseif(guesstarget){System.out.println(太大了再小一点);}else{System.out.println(恭喜你猜对了答案就是 target);System.out.println(你一共猜了 attempts 次。);guessedtrue;// 设置标志退出循环// 也可以用 break但用标志让代码更清晰}}scanner.close();}}这个程序综合了我们学过的变量、运算符、条件判断和循环是一个很好的阶段性练习。9. 循环的选择指南场景推荐循环已知确切的循环次数如遍历数组、计数for根据条件决定是否继续可能一次都不执行while至少需要执行一次如输入验证、菜单do-while遍历数组或集合的所有元素增强forfor-each今天的总结今天我们解锁了程序的“批量处理”能力while先判断后执行可能为 0 次。do-while先执行后判断至少为 1 次。for集初始化、条件、更新于一体适合计数循环。增强for简洁遍历数组/集合。break和continue控制循环的提前退出或跳过。嵌套循环处理多维问题。循环是程序中最常见的结构之一几乎每个有用的程序都离不开它。掌握好循环你就能写出更加强大、灵活的程序。动手试试用for循环计算 1 到 100 之间的奇数和、偶数和并分别打印。用嵌套循环打印一个 9x9 乘法表格式整齐。改写猜数字游戏增加一个限制最多猜 7 次如果 7 次都没猜对提示“游戏结束正确答案是 xxx”并退出用break或条件判断。写一个程序从用户输入一个正整数 n输出它的所有因数能整除 n 的数。比如输入 12输出 1,2,3,4,6,12。循环非常强大但也很容易写出 bug。多练习几次你就能驾驭它了。我们下一篇会讲方法——如何把代码组织成可复用的“积木块”让你的程序更有条理。我们下一篇见。 获取本系列示例代码请访问 GitCode。
11.【Java】流程控制之循环
摘要本文系统讲解了 Java 中循环结构的核心概念与使用方法涵盖while、do-while、for及增强for循环的语法、执行流程和适用场景并深入介绍了break、continue控制语句、循环嵌套以及常见陷阱。通过丰富的代码示例和综合的猜数字游戏实战帮助初学者快速掌握循环这一实现代码重复执行的关键技术为后续学习打下坚实基础。关键词Java 循环, while 循环, for 循环, break 和 continue, 循环嵌套我们学会了变量来存储数据学会了运算符来处理数据还学会了条件判断来让程序做决策。但你会发现如果程序只会从上到下执行一次那么很多事情都做不了。比如你想打印 100 遍“我爱你”难道要写 100 行System.out.println(我爱你);吗当然不是。如果让你计算 1 到 100 的总和难道要写123...100吗那样既不现实也毫无意义。我们需要一种能力让一段代码重复执行多次直到某个条件不再满足为止。这就是循环Loop。循环是程序设计中最重要的控制结构之一它让程序具备了“批量处理”的能力。Java 提供了三种循环结构while、do-while和for。另外还有一种专门遍历集合的“增强 for 循环”for-each。我们来逐一认识它们。1.while循环 —— 先判断再执行while循环是最基本的一种。它的语法是while(条件){// 循环体当条件为 true 时重复执行这里的代码}执行流程很简单判断条件是否为true。如果是执行一次循环体。执行完后再回到第 1 步继续判断。如果条件为false跳出循环继续执行后面的代码。如果条件一开始就是false循环体一次都不会执行。看一个经典例子打印 1 到 5 的数字。inti1;// 初始化计数器while(i5){// 条件i 小于等于 5System.out.println(i);i;// 更新计数器否则会死循环}System.out.println(循环结束);输出1 2 3 4 5 循环结束这里我们用了三个要素初始化int i 1;条件i 5更新i缺少任何一个循环都可能出问题。尤其是如果忘了i条件永远为真程序会一直打印 1直到你强行终止它——这就是死循环无限循环。写循环时一定要确保条件最终会变为false。while常用于“不确定次数”的循环比如你让用户输入一个正数如果输入的不是正数就一直提示重新输入。你事先不知道用户会输错多少次但循环可以一直问下去。ScannerscannernewScanner(System.in);intnumber;System.out.print(请输入一个正数);numberscanner.nextInt();while(number0){System.out.print(输入无效请重新输入一个正数);numberscanner.nextInt();}System.out.println(你输入了number);2.do-while循环 —— 先执行再判断do-while和while非常相似唯一的不同是do-while先执行一次循环体然后再判断条件。所以至少会执行一次。语法do{// 循环体}while(条件);注意最后有一个分号;别漏掉。把上面的“输入正数”的例子用do-while改写会更自然因为我们至少需要询问一次。ScannerscannernewScanner(System.in);intnumber;do{System.out.print(请输入一个正数);numberscanner.nextInt();}while(number0);System.out.println(你输入了number);这样写代码更紧凑不需要在循环前重复写一次输入语句了。什么时候用while什么时候用do-while如果可能一次都不执行用while。如果至少需要执行一次比如菜单交互、输入验证用do-while。3.for循环 —— 计数循环的“集大成者”for循环是最常用的循环结构尤其适合已知循环次数的场景。它把“初始化”、“条件”、“更新”三个要素整齐地写在一行结构清晰。语法for(初始化;条件;更新){// 循环体}执行顺序执行初始化只执行一次。判断条件如果为true则继续为false则退出。执行循环体。执行更新。回到第 2 步。看一个打印 1 到 5 的例子for(inti1;i5;i){System.out.println(i);}输出一样。这里int i 1只在循环开始时执行一次i在每次循环体执行完后执行。变量i的作用域仅限于for循环内部循环结束后i就不可用了除非你在外部提前定义。更复杂的for用法可以初始化多个变量用逗号分隔但类型必须相同。更新部分也可以多条语句用逗号分隔。三个部分都可以省略但分号不能省。比如for (;;)就是一个死循环相当于while(true)。// 同时初始化 i 和 jfor(inti0,j10;ij;i,j--){System.out.println(ii, jj);}// 输出i0, j10; i1, j9; i2, j8; i3, j7; i4, j6计算 1 到 100 的总和intsum0;for(inti1;i100;i){sumi;// sum sum i}System.out.println(1到100的总和是sum);// 50504. 增强for循环for-each —— 专为遍历而生在 JDK 5 中引入了一种更简洁的循环形式专门用来遍历数组或集合我们后面会详细学。它不需要索引也不需要手动维护计数器语法简单for(元素类型 变量名:数组或集合){// 循环体}比如遍历一个整数数组int[]numbers{10,20,30,40,50};for(intnum:numbers){System.out.println(num);}它会依次把数组中的每个元素赋值给num然后执行循环体。你不用关心索引也不用担心越界。不过增强 for 循环不能修改数组/集合的元素因为它拿到的只是一个副本而且在需要索引的情况下比如要修改某个位置的值也不适用此时还得用普通的for。我们在第四阶段学习集合时会大量使用增强 for现在先留个印象。5.break和continue—— 跳出或跳过在循环体中有时我们需要提前结束循环或者跳过当前这次迭代进入下一次。这时就需要break和continue。break立即终止整个循环跳出循环体执行循环后面的代码。continue立即结束本次迭代跳过本轮循环体中剩余的代码直接进入下一次迭代对于for循环会先执行更新部分再判断条件。// break 示例找到第一个能被 7 整除的数for(inti1;i100;i){if(i%70){System.out.println(第一个能被7整除的数是i);break;// 找到就跳出循环}}// 输出 7// continue 示例打印 1 到 10 之间的奇数for(inti1;i10;i){if(i%20){continue;// 偶数跳过不打印}System.out.println(i);}// 输出 1,3,5,7,9带标签的break和continue了解即可在嵌套循环中break默认只跳出当前最内层循环。如果你想从内层循环直接跳出外层循环可以使用标签labelouter:// 标签后面跟冒号for(inti0;i3;i){for(intj0;j3;j){if(i1j1){breakouter;// 直接跳出外层循环}System.out.println(ii, jj);}}// 只会打印 i0,j0; i0,j1; i0,j2; i1,j0虽然带标签的break有用但过多的嵌套和跳转会降低代码可读性。一般尽量通过设计循环条件来避免复杂跳转。6. 循环嵌套 —— 循环里面套循环一个循环的循环体内包含另一个循环这叫嵌套循环。最常见的场景是打印二维图形、处理矩阵等。比如打印一个 5 行 5 列的星号矩形for(introw1;row5;row){for(intcol1;col5;col){System.out.print(* );}System.out.println();// 每行结束换行}输出* * * * * * * * * * * * * * * * * * * * * * * * *稍微改一下打印一个直角三角形for(introw1;row5;row){for(intcol1;colrow;col){System.out.print(* );}System.out.println();}输出* * * * * * * * * * * * * * *嵌套循环时外层循环控制“行数”或“轮数”内层循环控制“每行的细节”。理解这个层次关系是关键。7. 循环中的常见陷阱死循环条件永远为真。比如while (true)或for (;;)或者忘了更新变量。一定要确保循环能结束。差一错误Off-by-one循环条件中的和搞混导致多一次或少一次。比如要循环 5 次用i 50~4还是i 50~5要清楚。在循环内改变循环变量的值如果不小心在循环体里修改了循环变量可能导致意外行为。break和continue的滥用它们会让代码逻辑变得不那么直观尽量用循环条件本身来控制流程而不是依赖跳转。8. 综合示例 —— 猜数字游戏我们把今天学的循环和条件判断结合起来写一个有趣的“猜数字”游戏程序随机生成一个 1~100 的整数用户输入猜测程序提示“大了”或“小了”直到猜中为止并统计猜的次数。packagecom.example.demo;importjava.util.Scanner;importjava.util.Random;// Random 类用于生成随机数/** * 猜数字游戏演示 while 循环、break、条件判断 */publicclassGuessNumber{publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);RandomrandomnewRandom();// 生成 1~100 的随机整数inttargetrandom.nextInt(100)1;// nextInt(100) 返回 0~991 变成 1~100intguess;intattempts0;booleanguessedfalse;System.out.println( 猜数字游戏 );System.out.println(我已经想好了一个 1~100 之间的整数猜猜看吧);// 使用 while 循环直到猜对为止while(!guessed){System.out.print(请输入你的猜测);guessscanner.nextInt();attempts;if(guesstarget){System.out.println(太小了再大一点);}elseif(guesstarget){System.out.println(太大了再小一点);}else{System.out.println(恭喜你猜对了答案就是 target);System.out.println(你一共猜了 attempts 次。);guessedtrue;// 设置标志退出循环// 也可以用 break但用标志让代码更清晰}}scanner.close();}}这个程序综合了我们学过的变量、运算符、条件判断和循环是一个很好的阶段性练习。9. 循环的选择指南场景推荐循环已知确切的循环次数如遍历数组、计数for根据条件决定是否继续可能一次都不执行while至少需要执行一次如输入验证、菜单do-while遍历数组或集合的所有元素增强forfor-each今天的总结今天我们解锁了程序的“批量处理”能力while先判断后执行可能为 0 次。do-while先执行后判断至少为 1 次。for集初始化、条件、更新于一体适合计数循环。增强for简洁遍历数组/集合。break和continue控制循环的提前退出或跳过。嵌套循环处理多维问题。循环是程序中最常见的结构之一几乎每个有用的程序都离不开它。掌握好循环你就能写出更加强大、灵活的程序。动手试试用for循环计算 1 到 100 之间的奇数和、偶数和并分别打印。用嵌套循环打印一个 9x9 乘法表格式整齐。改写猜数字游戏增加一个限制最多猜 7 次如果 7 次都没猜对提示“游戏结束正确答案是 xxx”并退出用break或条件判断。写一个程序从用户输入一个正整数 n输出它的所有因数能整除 n 的数。比如输入 12输出 1,2,3,4,6,12。循环非常强大但也很容易写出 bug。多练习几次你就能驾驭它了。我们下一篇会讲方法——如何把代码组织成可复用的“积木块”让你的程序更有条理。我们下一篇见。 获取本系列示例代码请访问 GitCode。