首先Java中的循环结构包括:for , while ,do...while
但不管是哪一种循环结构一定包含以下循环四要素:
-
循环变量初始化
-
循环执行条件判断
-
循环体
-
循环变量迭代
for循环体
循环流程图:

for([循环变量初始化];循环执行条件判断;[循环变量迭代]){
循环体;
}
//循环变量初始化和循环变量迭代可以不写在()内,但两个";"不可以省略。
//具体结构如下:
循环变量初始化;
for(;循环执行条件判断;){
循环体;
循环变量迭代;
}
说明:
-
当循环体只有一条语句时,可以省略{},但并不建议这样写代码。
-
循环执行条件判断语句的返回值一定是一个boolean值。(往往在写for循环时,这一部分是最难的)
-
循环变量初始化和循环变量迭代都可以是多条,中间用逗号分隔。
简单案例:
//打印100以内所有7的倍数的整数,通过化繁为简的思想
//首先我们先思考如何打印1-100,然后再思考通过判断谁是7的倍数
for(int i = 1 ; i <= 100 ; i++){
//System.out.println(i); // 1-100
if(i % 7 == 0){
System.out.println(i);
}
}
while循环体
循环流程图:

基本语法:
循环变量初始化
while(循环条件判断){
循环体:
循环变量迭代:
}
可以看到while循环体同样包含了循环四要素,其实所有的循环体在底层都是同样的结构,但为什么要分几种循环体呢?这就好比有人习惯用叉子,有人习惯用筷子一样。
说明:
-
while循环是先判断条件是否满足再进行循环,这点儿与do...whlie不同。
-
在写while循环时一定不要忘记了退出循环的条件,例如循环变量的迭代。
简单案例:
//不断输入内容,直到输入内容为exit,则退出循环
import java.util.Scanner;
public class While
{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String name = ""; //String对象声明时,要习惯对它进行初始化
while(!"exit".equals(name)){ //使用常量"exit"调用equals()方法,防止出现空指针异常
name = input.next();
}
System.out.println("程序结束!");
}
}
通过这个案例我们看到,while循环并不一定要使用变量值的迭代来进行判断是否退出循环。
我们甚至可以这样使用while循环:
boolean flag = true;
while(flag){
循环体;
if(条件判断){
flag = false;
}
}
当然使用for循环也可以实现这样的功能,只是使用while循环能让我们更清晰的看出,可以通过boolean值的改变来控制何时退出循环。
do...while循环体
循环流程图:

基本语法:
循环变量初始化
do{
循环体;
循环变量迭代;
}while(循环条件判断);
说明:
-
从do...while循环的流程图我们就可以看出,do...while循环是先执行一次循环体,再进行循环条件判断。也就是说do...while循环不管如何一定会执行一次,适合用于菜单的打印。
-
要注意在while()之后有一个";",这一点与for循环体和while循环体不同。因Java将do...while循环体看作是一条语句。
简单案例:
//统计1——200之间能被5整除但不能被3整除的个数
import java.util.Scanner;
public class While
{
public static void main(String[] args){
int a = 1;
int count = 0;
do{
if(a % 5 == 0 && a % 3 != 0){
count += 1; //计数
}
a += 1;
}while(a <= 200);
System.out.println("1——200之间能被5整除但不能被3整除的数有" + count + "个" );
}
}
多重循环(重难点)
多重循环即循环的嵌套,就如同之前的if条件判断时的嵌套格式一样。
多重循环实际上就是将内层循环当作外层循环的循环体,所以只有当内层循环退出时(即内层循环的循环条件判断结果为false时)才会执行外层循环的下一次循环。
例如:
for(int i = 1;i <= 10;i++){
//只有当j>10时,才会执行下一次的i循环。
for(int j = 1;j <= 10;j++){
System.out.println("奋斗的小范同学!"); //一共将打印100次。 i * j
}
}
简单案例1:
//统计3个班成绩情况,每个班有3名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。
//并统计3个班的总及格人数。
import java.util.Scanner;
public class DoubleFor
{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
double classAvg = 0.0;
double allClassAvg = 0.0;
int count = 0; //及格人数
for(int i = 0; i<3;i++){
//三个班
double classSum = 0.0;//计算每个班的成绩总和
System.out.println("班级"+(i+1));
System.out.println("输入班级人数:");
//每个班3个学生
int classNum = input.nextInt(); //通过控制台输入每个班学生人数
for(int j = 0;j< classNum ;j++){
double temp = 0.0; //用于接收控制台输入的成绩
System.out.println("输入成绩:");
temp = input.nextDouble();
classSum += temp;
if(temp >= 60){ //统计及格人数
count += 1;
}
}
classAvg = classSum / classNum;
System.out.println("班级"+(i+1)+"的平均成绩为:" + classAvg);
allClassAvg += classAvg;
}
System.out.println("所有班平均成绩为:"+(allClassAvg/3));
System.out.println("所有班及格人数为:"+count);
}
}
运行结果:

简单案例2:
//打印空心等腰三角形 化繁为简的思想!!
// * 1.首先尝试打印一半的实心金字塔
// * * 2.再尝试打印整个的实心金字塔
// * * 3.最后思考如何打印空心金字塔
// * *
// * *
//***********
import java.util.Scanner;
public class DayHomeWork
{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.println("请输入等腰三角形层数:");
int num = input.nextInt();
for(int i = 0 ; i <= num;i++){ //外层循环控制层数
for(int j = 0;j<num-i;j++){ //内层循环控制 每行打印的空格数
System.out.printf(" ");
}
for(int k = 0;k < (2*i-1);k++){ //内层循环控制 每行打印的*数
if(i == 0 || i == num){ //第一行和最后一行正常输出
System.out.printf("*");
}else{//空心打印
if(k == 0 || k == (2*i-1)-1){ //第一个和最后一个"*"打印
System.out.printf("*");
}else{ //其他时候打印空格
System.out.printf(" ");
}
}
}
System.out.println();
}
}
}
跳转控制语句
作用于循环体内的跳转控制语句有:break,continue ,return
break
流程示意图(while循环体为例):

之前我们在switch中也用到了break关键字,其作用是退出switch语句。在三大循环体中,它的作用同样如此。
break关键字使用场景通常时我们不知道循环次数时,用break来退出循环。
简单案例:
public class Ninety
{
public static void main(String[] args){
int count = 0;
for(int i = 0 ; i < 100 ; i++){
count += 1;
if(((int)(Math.random()*100)) == 90 ){
break;
}
}
System.out.println("一共用了:"+count+"次!");
}
}
continue
流程示意图(以while循环体为例):

continue关键字作用:退出此次循环,直接进入下一次循环。
简单案例:
public class ContinueTest
{
public static void main(String[] args) {
int i = 1;
while( i <= 4) {
i++;
if( i == 2) {
continue; //跳过2,不进行打印直接进入下次循环
}
System.out.println("i=" + i);
}
}
}
//打印结果为: 1 3 4 5
// 1 3 4 5
// 1 3 4 5
return
return使用在方法,表示跳出所在的方法。这里只做简单了解,有个概念就行。
标签
break 与 continue 出现在多重嵌套的语句块中时,可以通过标签指定 具体要跳转到哪一层语句块。
若不适用标签,即默认跳出最近的一层语句块,就如同上面的案例。
简单案例(这里以continue为例):
lable1:
for(int i = 1 ; i < 3;i++){
lable2:
for(int j = 1 ; j < 4;j++){
if(j == 2){
continue lable2; // continue lable1;
}
System.out.println(j);
}
}
如果使用 continue lable2将打印输出:1 3 ; 1 3
如果使用 continue lable1将打印输出:1 ; 1
注:本文所有流程图转载自:尚硅谷-韩顺平B站视频地址(https://www.bilibili.com/video/BV15C4y1b76A?p=1)