在java中使一部分代码按照指定次数或一定条件反复执行的流程控制结构就是循环结构,循环结构可以分为while循环、do while循环和for循环三类,其中比较常用的是while循环和do while循环。但是需要特别注意区分while循环和do while循环的运行原理,避免混淆。
while循环
while循环是除了for循环外,最常使用的循环结构,它的语句格式可以表述如下:
初始化语句;
while(判断条件语句){
循环体语句;
控制条件语句
}
while循环的执行流程为,由初始化语句开始进入循环体结构,对判断条件语句进行判断,如果判断条件语句输出的boolean类型的值为true那么就执行循环体语句,并且改变控制条件语句的值,然后将这个值返回道判断语句中,如果输出的boolean类型的值仍为true,那么就重复上面的流程,直到判断体语句输出的boolean类型的语句为false,循环结束。
比如在下面的程序中,要求打印0~120之间所有能被5整除的数。初始化语句让 i 这个数从0开始进入循环结构,先判断这个数是否在0~120之间,如果在,那就判断它能否被5整除,如果能就将其打印,如果不能,就跳过,并且将这个数加上1并将加1后的值赋继续赋给 i ,再判断是否再0~120之间,如果在,那就重复上面的操作,直到 i 这个数不再这个范围内才跳出循环。
public class WhileZuoYe02 {
public static void main(String[] args){
int i = 0;
while(i<121){
if(i%5==0){
System.out.println(i);
}
i++;
}
}
}
值得注意的是,在以上的流程中,初始化语句和控制条件语句是有可能被省略的,最典型的例子就是死循环,如下面的代码所示,并没有初始化语句和控制条件语句,当运行程序时,电脑会不停的打印 I love you!。除非手动停止,程序才会停止打印 I love you!
public class SiXunHuan {
public static void main(String[] args) {
while(true){
System.out.println("I love you!");
}
}
}
do while循环
如果while循环用一句话来说是当满足某个条件时做一件事,那么do while循环用一句话来说就是做某一件事直到不满足某个条件时结束。do while的语句格式如下所示:
初始化语句;
do{
循环体体语句;
控制条件语句;
}
while(判断条件语句);
比如在下面的程序中,要求计算1~100的累加结果,首先对数据进行初始化,定义sum用以储存累加结果,定义i = 0,让数据从0开始变化,随后进行一次累加,累加结束,i自动加1,然后在while中判断是否满足条件,即判断条件语句输出的boolean值是否为true,如果是,则还需要执行循环体,直到 i > 100时,不满足 i <= 100 这个条件,那么循环结束,跳出循环结构。
/**
* 用循环结构计算1到100的累加和,用以演示do-while的使用
*/
public class DoWhileDemo {
public static void main(String[] args){
int i = 0;
int sum = 0;
do{
sum += i;
i++;
}while(i<=100);
System.out.println("计算结果为:"+sum);
}
}
从上面的循环流程中,能够很明显的发现while循环和do while循环的区别。while循环是先判断是否符合条件再执行循环体,而do while循环不同,不论是否满足条件,程序都要先执行一次循环体才进行条件判断。这种区别在下面的这个代码中对比尤为明显,首先对数据初始化,j 和 k 的值均为0,j < 0 、k < 0明显不成立,也就是说在while循环和do while 循环中,判断条件语句输出的结果均为false,在这种情况下,通过程序运行结果能发现,while循环没有执行循环体语句直接跳出了循环,而do while循环先执行了一次循环体语句,随后才跳出循环。
**
* 演示do-while的使用
*/
public class DoWhileDemo {
public static void main(String[] args){
int j = 0;
while(j<0){
System.out.println(j);
j++;
}
int k = 0;
do{
System.out.println(k);
k++;
}while(k<0);
}
}
for循环
相对于while循环和do while循环 ,for循环的使用更为广泛,代码结构也更为简单。它的运行流程与while循环在某种程度来说是一样的,只是语句在程序中的位置不同而已。for循环的结构为:
for(初始化语句;判断条件语句;控制条件语句){
//循环体
}
通过与while循环进行比较,能发现,如果将循环体插入判断条件语句和控制条件语句中间,那么它的语句顺序就只是将whlie循环中的语句横过来而已,它的循环流程可以用下面的图片来体现
又如下面的程序中,要倒序打印1~100之间的整数,首先初始化 i 的值为100,然后进入判断条件语句,100>0成立,于是执行循环体,打印数字100,随后执行控制条件100减去1变成99,然后又进入判断条件语句进行循环,直到 i = -1时,-1>0 不成立,于是跳出循环程序结束。
/**
* 使用for循环倒序打印出1到100间的数字
*/
public class ForZuoYe01 {
public static void main(String[] args){
for(int i = 100;i>0;i--){
System.out.print(i+"\t");
}
}
}
循环的嵌套
在java中,针对循环的嵌套结构,主要是对for循环来说的,对于for循环的嵌套,只要弄清楚它的运行原理,它的使用也就自然懂了,这里我们使用一个程序来研究它的运行原理。
在下面这个程序中,首先定义 i = 1,然后判断 i<5 成立于是执行第一个循环体,循环体中定义 j = i,即将 i 的值赋给 j,所以此时 j 的值为1,1 < 5成立,于是执行第二个循环体,打印了第一个 * 号,然后执行j++,j 的值变成2,2<5成立,再次执行第二个循环体,打印第二个 * 号,j++,j 的值变成3,3<5成立,执行第二个循环体,打印第三个 * 号,再次执行j++,j 的值变成4,4<5成立,执行第二个循环体打印第四个 * 号,执行j++,j 的值变成5,5 <5不成立,退出第二个循环,执行System.out.println();进行换行操作,至此此第一个循环体执行完一次,执行i++,i 的值变成2,2<5成立,再次执行第一个循环体,j = i,将 i 的值赋给j,j 的值变为2,2<5成立,执行第二个循环体,打印第五个 * 号,j++,j 的值变为3,3<5成立,执行第二个循环体,打印第六个 * 号,j++,j 的值变为4,4<5成立,执行第二个循环体打印第七个 * 号,j++,j 的值变为5,5<5不成立,退出第二个循环,执行System.out.println();进行换行操作,第一个循环体执行完两次,i ++,i 的值变为3,3<5成立,执行第一个循环体, j = i,将 i的值赋给 j,此时j 的值为3,3<5成立,执行第二个循环体打印第八个 * 号,j++,j 的值变为4,4<5成立,执行第二个循环体打印第九个 * 号,j++,j 的值变为5,5<5不成立,退出第二个循环,执行System.out.println();进行换行操作,第一个循环体执行完三次,i++,i 的值变为4,4<5成立,执行第一个循环体,j = i,将i的值赋给j,此时j的值为4,4<5成立,执行第二个循环体打印第十个 * 号,j++,j 的值变为5,5<5不成立,退出第二个循环,执行执行System.out.println();进行换行操作,第一个循环体执行完第四次,i++,i 的值变为5,5<5不成立退出第一个循环,程序结束。
public class ForQian03 {
public static void main(String[] args) {
for(int i = 1;i <= 5;i++){
for(int j = i;j < 5;j++){
System.out.print("*"+"\t");/“\t”表示制表符,相当于按一次tab 键
}
System.out.println();//换行
}
}
}