Java for循环语句
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。一组被重复执行的语句称之为循环体,能否继续重复,取决于循环的终止条件。循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序被称为循环体。循环语句是由循环体及循环的终止条件两部分组成的。
为了帮助大家理解循环语句存在的意义,我们来看一段代码:
-
System.out.
println(
"hello world!");
-
System.out.
println(
"hello world!");
-
System.out.
println(
"hello world!");
-
System.out.
println(
"hello world!");
-
System.out.
println(
"hello world!");
-
System.out.
println(
"hello world!");
-
System.out.
println(
"hello world!");
-
System.out.
println(
"hello world!");
-
System.out.
println(
"hello world!");
-
System.out.
println(
"hello world!");
-
//...
-
//...
以上程序的业务背景是:输出100行“hello world!”,如果我们像以上方式进行代码编写的话,代码将无法得到重复使用,大家也可以看到“System.out.println("hello world!")”这行代码重复出现,直到输出100个为止。显然程序应该找一种更好的实现方式,这个时候我们就可以借助java语言中的循环语句来实现了。
java中的循环语句共包括三个,分别是:for循环、while循环、do..while循环,接下来我们先来学习for循环。
for循环的语法格式如下图所示:
图6-13:for循环语法结构
对以上for循环语法结构进行说明:初始化表达式最先执行,并且在整个循环当中初始化表达式只执行一次,布尔表达式结果是true或者false,true表示循环可以继续执行,false表示循环结束,循环体当中的代码就是需要反复执行的代码,更新表达式一般是用来更新某个变量的值,更新操作之后可能布尔表达式的结果就不再是true了。那么for循环的执行顺序以及原理如下图所示:
图6-14:for循环语句执行顺序及原理
对于for循环来说,初始化表达式、布尔表达式、更新表达式都不是必须的,当布尔表达式缺失的时候,没有条件控制的前提下,会形成死循环,我们来看一下最简单的for循环形式:
-
for(;;){
-
System
.out
.print(
"死循环、");
-
}
执行结果如下图所示:
图6-15:死循环输出结果
最常见的for循环是怎样的呢?看以下代码:
-
for(
int i =
1; i <=
10; i++){
-
System.out.
println(
"i = " + i);
-
}
运行结果如下图所示:
图6-16:for循环输出1~10
对以上代码进行分析:首先执行int i = 1,并且只执行一次,定义初始化变量i,赋值1,然后判断i <= 10结果为true,则执行循环体打印i = 1,循环体结束之后,执行i++,然后i变成了2,继续判断i <= 10结果为true,则执行循环体打印i = 2,如此循环执行,直到打印i = 10之后,再执行i++让i变成了11,然后判断i <= 10结果为false,循环结束,这样就完成了1~10的输出,当然程序不是固定的,大家也可以把条件i <= 10修改为i < 11,这样也是可以的。
关于for循环的使用我们还需要注意初始化变量的作用域,在for循环当中声明的变量只在for循环中有效,当for循环结束之后,初始化变量的内存就释放了/消失了,所以在for循环之外是无法访问该变量的,例如以下代码在编译的时候就会报错了:
-
//在for循环内部声明的变量i只在for循环中可见/有效
-
for(
int i =
1; i <=
10; i++){
-
System.out.
println(
"i = " + i);
-
}
-
//这行编译报错,i变量不存在
-
System.out.
println(
"i = " + i);
当然,这样写就不会报错了:
-
public static void test(){
-
//变量的声明位置放到了for循环之外
-
int i =
1;
-
for(; i <=
10; i++){
-
System.
out.println(
"i = " + i);
-
}
-
//这里就可以访问变量i了
-
System.
out.println(
"i = " + i);
-
}
为什么这样写就可以了呢?那是因为i变量的作用域已经被扩大了,不再只是for循环中可以使用,for循环之外也可以使用,换句话说,以上的for循环结束之后i变量的内存并不会被释放。后续的程序可以继续使用。i变量的作用域是在整个test()方法中都有效,直到test()方法执行结束的时候才会释放i变量的内存空间。
接下来我们再来看看for循环还有哪些其它的写法:
-
for(
int i =
10; i >
0; i--){
-
System.out.
println(
"i = " + i);
-
}
-
System.out.
println(
"-------------分割线---------------");
-
for(
int i =
10; i >
0; i -=
2){
-
System.out.
println(
"i = " + i);
-
}
-
System.out.
println(
"-------------分割线---------------");
-
for(
int i =
100; i >=
10; i /=
3){
-
System.out.
println(
"i = " + i);
-
}
以上程序运行结果,请看下图:
图6-17:for循环的其它编写方式执行结果
接下来,我们再使用for循环实现1~100所有数字的求和,实现思路是:定义变量i,初始值从1开始,每循环一次加1,这样就可以取到1~100的每一个整数了,那么求和怎么做呢?求和就是将1~100的每一个整数累加,这必然需要提前定义一个变量,使用变量实现累加,例如:a += 1,a += 2,a += 3...,代码如下所示:
-
int sum =
0;
-
for(
int i =
1; i <=
100; i++){
-
sum += i;
-
}
-
System.out.
println(
"sum = " + sum);
运行结果如下所示:
图6-18:1~100所有整数求和
通过以上程序我们可以学到什么?编程语言当中的累加可以使用扩展类赋值运算符+=来实现,另外sum变量为什么定义到for循环外面,而不是定义到循环体当中呢?那是因为当定义到循环体内之后,每一次循环体在执行的时候,都会重新定义sum变量,这样会让sum变量归0,无法达到累加的效果。
接下来,我们在以上程序的基础之上实现1~100所有奇数的和,编程思路是:在累加之前先判断变量i是否为奇数,如果是奇数则累加,这就需要在sum += i外面套一个if语句进行控制,代码如下所示:
-
int
sum
=
0
;
-
for(int
i
=
1
;
i
<=
100
;
i++){
-
if(i
%
2
!=
0
){
-
sum
+=
i;
-
}
-
}
-
System.out.println("sum
=
" + sum);
运行结果如下所示:
图6-19:1~100所有奇数和的执行结果
其实以上的方式是将每一个数字取出来,然后再判断是否为奇数,这种方式会导致循环次数达到100次,实际上可以换成另外一种解决方案,假设从1开始,每次累加2,那么每次取出的数字为1,3,5...,这样正好每次取出的数字都是奇数,可以直接累加了,这样循环的次数基本上会减半,效率则提高了,这种代码既优雅,又高效。请看以下代码:
-
int sum =
0;
-
for(
int i =
1; i <
100; i +=
2){
-
sum += i;
-
}
-
System.out.
println(
"sum = " + sum);
运行结果如下所示:
图6-20:1~100所有奇数和的执行结果
以上演示的所有循环都是单层的,循环当中可以嵌套循环吗?答案是:当然可以,之前我们就说过所有控制语句都是可以嵌套使用的,当循环A中嵌套循环B的时候就等于在A循环体中的代码是B循环。其实大家在学习循环嵌套的时候完全没必要特殊化对待,完全可以把A循环体当中的B循环看做是一段普通的java代码。接下来我们看一段代码:
-
//循环5次(B循环)
-
for(int i =
1;i <=
5; i++){
-
System
.out
.print(
"i = " + i +
",");
-
}
-
-
System
.out
.println();
-
-
//循环2次(A循环)
-
for(int j =
1;j <=
2; j++){
-
System
.out
.print(
"j = " + j +
",");
-
}
-
-
System
.out
.println();
-
-
//将B循环放到A循环体当中
-
for(int j =
1;j <=
2; j++){
//A循环(2次)
-
-
for(int i =
1;i <=
5; i++){
//B循环(5次)
-
-
System
.out
.print(
"i = " + i +
",");
-
-
}
-
}
运行结果如下图所示:
图6-21:for循环嵌套
分析以上for循环嵌套,请看下图:
图6-22:for循环嵌套分析
分析循环嵌套的小窍门,如下图所示:
图6-23:for循环嵌套小窍门
学习了for循环嵌套的使用,我们一起来写一下经典的九九乘法表,九九乘法表的结构大家还记得吗,我们一起来回顾一下小学的知识(嘿嘿):
图6-24:九九乘法表结构
通过观察九九乘法表结构我们可以看出来它有9行,所以可以得出一定需要以下代码:
-
public static void main(String[] args) {
-
for(
int i =
1; i <=
9; i++){
-
System.
out.println(
"i = " + i);
-
}
-
}
运行结果如下:
图6-25:九九乘法表9行
观察上图我们可以得出i是行号,那么再次观察九九乘法表的规律得知,第1行1个式子,第2行2个式子,第3行3个式子...,第9行9个式子,那么结论是第i行有i个式子,以上循环确定为外层循环,共循环9次,外层循环每循环一次要保证能够输出九九乘法表的1整行。那么输出九九乘法表1整行的时候又需要一个循环进行控制,而且这个循环被放到内部,循环的次数随着行号的变化而变化。代码如下所示:
-
for (
int i =
1; i <=
9; i++) {
-
-
for (
int j =
1; j <= i; j++) {
-
-
System.out.
print(i * j +
" ");
-
-
}
-
-
System.out.
println();
-
-
}
运行结果如下所示:
图6-26:九九乘法表每个表达式的执行结果
分析以上代码,请看下图:
图6-27:分析九九乘法表程序
接下来我们在每一个“结果”前添加“i * j = ”,代码如下所示:
-
for (
int i =
1; i <=
9; i++) {
-
-
for (
int j =
1; j <= i; j++) {
-
-
System.out.
print(i +
"*" + j +
"=" + i * j +
" ");
-
-
}
-
-
System.out.
println();
-
-
}
运行结果如下所示:
图6-28:九九乘法表运行结果
通过以上代码的学习,需要每位读者能够掌握什么是循环,为什么要使用循环,for循环的语法结构是什么,for循环的执行顺序以及原理是什么,嵌套的for循环又应该怎么理解,大家也可以挑战一下三层for循环嵌套,或者更多。总之for循环在实际开发中使用非常频繁,大家务必掌握。
Java while循环语句
循环语句除了for循环之外还有while和do..while,接下来我们先来看一下while循环,首先学习while循环的语法结构,如下图所示:
图6-29:while循环语法结构
通过上图可以看出while循环的语法结构非常简单,它的执行顺序以及原理是这样的,先判断布尔表达式的结果,如果是true,则执行循环体,循环体结束之后,再次判断布尔表达式的结果,如果是true,再执行循环体,循环体结束之后,再判断布尔表达式的结果,直到结果为false的时候,while循环结束。如果起初第一次判断布尔表达式结果的时候就是false,那么while循环体执行次数就为0了。它的执行顺序以及原理也可以参见下图:
图6-30:while循环执行顺序以及原理
通过while循环的执行原理可以得出while循环的循环体执行次数可能是0次,也可能是N次。那么要想使用while循环实现一个死循环,代码应该怎么写呢?
-
while(
true){
-
System.
out.println(
"死循环");
-
}
运行结果就不再给大家展示了,要使用while实现一个死循环是非常简单的,让判断条件一直为true就可以了。那么使用while循环实现输出1~10应该怎么做呢?
-
int i =
0;
-
while(i <
10){
-
i++;
-
System.
out.println(
"i = " + i);
-
}
运行结果如下图所示:
图6-31:使用while循环输出1~10
其实使用while循环输出1~10不止有以上这一种方式,还有其他方式,例如:
-
int j =
1;
-
while(j <=
10){
-
System.
out.println(
"j = " + j);
-
j++;
-
}
运行结果如下图所示:
图6-32:使用while循环输出1~10
当然,大家还可以想想有没有其它的写法,可以自己写一写,例如:
-
int i =
0;
-
while(i <
10){
-
System.
out.println(
"i = " + (++i));
-
}
再如:
-
int j =
1;
-
while(j <=
10){
-
System.
out.println(
"j = " + j++);
-
}
使用while循环计算1~100所有偶数的和,应该怎么做呢?
-
int sum =
0;
-
int i =
0;
-
while(i <=
100){
-
if(i %
2 ==
0){
-
sum += i;
-
}
-
i++;
-
}
-
System.
out.println(
"sum = " + sum);
-
-
sum =
0;
-
int j =
0;
-
while(j <=
100){
-
sum += j;
-
j +=
2;
-
}
-
System.
out.println(
"sum = " + sum);
运行结果如下图所示:
图6-33:while循环计算1~100所有偶数和
实际上while循环可以看做是for循环的另一种变形写法,本质上是一样的,执行效率上也是一样的,硬要说它们有什么不同的话,首先while循环语法结构比for更简单,for循环的计数器比while更清楚一些,另外for循环的计数器对应的变量可以在for循环结束之后就释放掉,但是while循环的计数器对应的变量声明在while循环外面,扩大了该变量的作用域。总之,不管是for还是while,大家都必须掌握,因为这两个循环使用最多。
Java do while循环语句
do..while循环是while循环的变形,它们的区别在于do..while循环可以保证循环体执行次数至少为1次,也就是说do..while循环的循环体执行次数是1~N次,它有点儿先斩后奏的意思,而while循环的循环体执行次数为0~N次。
为什么do..while循环可以保证至少执行一次呢,它和while循环的区别在哪里呢?实际上是因为在开始执行while循环的时候,最先执行的是条件判断,只有条件为true的时候才会执行循环体,既然是这样,那么条件就有可能为false,这个时候就会导致循环体执行次数为0次,俗话说,还没开始就结束了。而do..while循环最先执行的不是条件判断,它会先执行循环体,然后再进行条件判断,这样就可以保证循环体至少执行一次喽!
接下来我们一起来看看do..while循环的语法结构,以及执行顺序,如下图所示:
图6-34:do..while语法结构和执行顺序
或者参见下图:
图6-34:do..while语法结构和执行顺序
上图中清晰的描述了do..while循环执行顺序,这里就不再赘述,但需要注意的是do..while循环在最后的时候有一个半角的分号“;”,这个不能丢,丢掉之后编译器就报错了。接下来我们看一个do..while循环的典型案例。
示例代码:业务背景:我们通常在使用的一个系统的时候需要登录,假设用户名或者密码记不清楚了,你是不是需要不断的“反复的”输入用户名和密码,这就是一个非常典型的循环案例,而这个循环当中首先要做的第一件事儿不是判断用户名和密码是否正确,它的起点是先让用户输入用户名和密码,所以这个时候我们就需要使用do..while循环来完成。请看以下代码:
-
java.util.Scanner scanner =
new java.util.Scanner(System.
in);
-
String username;
-
String password;
-
do{
-
System.
out.print(
"用户名:");
-
username = scanner.next();
-
System.
out.print(
"密码:");
-
password = scanner.next();
-
}
while(!username.
equals(
"admin") || !password.
equals(
"123"));
-
System.
out.println(
"登录成功,欢迎" + username +
"回来!");
运行效果如下图所示:
图6-36:do..while案例
解释以上程序:先提示用户输入用户名和密码,然后判断用户名和密码,当用户名不是admin或者密码不是123的时候继续提示用户输入用户名和密码,直到用户输入的用户名是admin并且密码是123的时候循环结束,循环结束之后输出登录成功的信息,只要循环没有结束就表示用户名和密码还是不对,当然,在现实的系统当中我们不可能允许用户无限制的输入用户名和密码,通常会给几次输入机会,当机会用完之后还是没有登录成功,通常该账户就被锁定了,你不妨试试这种业务又应该如何完成。
总之while和do..while循环的区别就在于do..while会先执行一次循环体,然后再判断条件,这样do..while的循环体至少执行一次。而while循环则是先判断条件是否合法,如果不合法,则循环体就没有任何执行的机会。while循环体执行次数是0~N次,但是do..while循环体执行次数则是1~N次。
转载:https://blog.csdn.net/bjpowernode_com/article/details/109569981