Java循环结构详解:while循环,do…while循环,for循环及增强for循环
文章目录
while循环
while是最基本的循环,它的结构为:
while(boolean表达式){
//循环内容
}
注意事项:
- 只要boolean表达式为true, 循环就会一直执行下去。
- 绝大多数情况下是需要让循环停止的,我们需要一个让表达式失效的方法来结束循环。
- 少数情况需要循环一直执行,比如服务器的请求响应监听等。
- 循环条件一直为true就会造成无限循环(死循环)。正常的业务编程中应该尽量避免死循环,这会影响程序性能或者造成程序卡死崩溃!、
看一个简单的例子:
输出1-100
public class Demo01 {
public static void main(String[] args) {
/*输出1-100*/
int a = 0;
while(a<100){
a++;
System.out.println(a);
}
}
}
输出结果
1
2
...
100
输出1+2+3+…+100的和:
public class Demo02 {
public static void main(String[] args) {
/*用while计算1+2+...+100=?*/
int sum= 0;
int a = 0;
while(a<100){
a = a+1;
sum = sum + a;
}
System.out.println("The sum is" + sum);
}
}
输出结果
The sum is 5050
用for循环输出1-1000之间能被5整除的数,且每行输出20个。
public class Demo03 {
public static void main(String[] args) {
/*用while循环输出1-1000之间能被5整除的数,且每行输出20个。*/
int i=0;
while(i<=1000){
i++;
if(i%5==0){
System.out.print(i + "\t");
}
if(i%(5*20)==0){
System.out.println();
}
}
}
}
输出结果:
5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100
105 110 115 120 125 130 135 140 145 150 155 160 165 170 175 180 185 190 195 200
205 210 215 220 225 230 235 240 245 250 255 260 265 270 275 280 285 290 295 300
305 310 315 320 325 330 335 340 345 350 355 360 365 370 375 380 385 390 395 400
405 410 415 420 425 430 435 440 445 450 455 460 465 470 475 480 485 490 495 500
505 510 515 520 525 530 535 540 545 550 555 560 565 570 575 580 585 590 595 600
605 610 615 620 625 630 635 640 645 650 655 660 665 670 675 680 685 690 695 700
705 710 715 720 725 730 735 740 745 750 755 760 765 770 775 780 785 790 795 800
805 810 815 820 825 830 835 840 845 850 855 860 865 870 875 880 885 890 895 900
905 910 915 920 925 930 935 940 945 950 955 960 965 970 975 980 985 990 995 1000
do…while循环
对于while语句而言。如果不满足条件则不能进入循环。但有时候我们需要即使不满足条件也至少执行一次。
do…while语法:
do{
//代码语句
}while(boolean表达式);
while和do…while的区别:
- while先判断后执行。do…while是先执行后判断。
- do…while总是保证循环体至少会执行一次!
看一个简单的例子:
输出1+2+3+…+100的和:(与上述while的例子对比)
public class DoWhileDemo01 {
public static void main(String[] args) {
/*用while计算1+2+...+100=?*/
int sum= 0;
int a = 0;
do{
a = a + 1;
sum = sum + a;
}while(a<100);
System.out.println("The sum is" + sum);
}
}
输出结果:
The sum is 5050
可见此时输出结果并没有任何差别。
看一个更鲜明的例子:
对比while和do…while第一次的输出
public class DoWhileDemo02 {
public static void main(String[] args) {
int a = 0;
while(a<0){
a = a + 1;
System.out.println(a);
}//while先判断a<0,故而直接跳过循环,没有任何输出。
System.out.println("===============");
do{
a = a + 1;
System.out.println(a);
}while(a<0) ;
//do...while先执行了do{}语句后再进行判断。故而只执行了一次。输出1.
}
}
输出结果:
===============
1
for循环
- 虽然所有的循环结构都可以用while 或者do…while表示,但Java提供了另一种语句——for循环,使一些循环结构变得更加简单。
- for循环是支持迭代的一种通用结构,是最有效、最灵活的循环结构。>
- for循环执行的次数是在执行前就确定的。
语法格式:
for(初始化;布尔表达式;更新){
//代码语句
}
看一个while和for循环输出0-100的例子:
public class Demo01 {
public static void main(String[] args) {
int a = 0; //初始化条件
while(a<100){
System.out.println(a);
a+=1;//迭代
}
System.out.println("While循环结束");
//(初始化;条件判断;迭代)
for (int i = 0; i <=100; i++) {//IDEA中可以直接100.for + Tab
System.out.println(i);
}
System.out.println("for循环结束");
}
}
输出结果:
0
1
...
100
While循环结束
0
1
...
100
for循环结束
for循环的运行过程:
- 最先执行初始化步骤。可以声明一种类型也可以是空语句。
- 然后检测boolean表达式的值。如果为true则循环体被执行。如果为false则循环终止,开始执行循环体后面的语句。
- 每执行一次循环后,更新循环控制变量(迭代因子控制循环变量的增减)。
- 再次检测boolean表达式。
- 循环执行以上过程
简单说来就是:
for(a.初始化;b.布尔表达式;c.更新)
d.//代码语句
}
e.//循环体后的语句
a.——b.——c.——b.——c…——e.
死循环:
既没有初始化,也没有判断语句。
for(;;){
}
计算0-100之间所有奇数与偶数的和。
public class Demo02 {
public static void main(String[] args) {
/*计算0-100之间所有奇数和偶数的和*/
//先将0-100间的奇数与偶数都写出来
int oddSum = 0;//保存奇数的和
int evenSum = 0;//保存偶数的和
for (int i = 0; i <=100; i++) {
if(i%2!=0){
oddSum = oddSum +i;
}else {
evenSum = evenSum +i;
}
}
System.out.println("oddSum is" + oddSum);
System.out.println("evenSum is" + evenSum);
//再输出二者的和
System.out.println("The sum of oddNum and evenNum is" + (oddSum + evenSum));
}
}
输出结果:
oddSum is2500
evenSum is2550
The sum of oddNum and evenNum is5050
用for循环输出1-1000之间能被5整除的数,且每行输出20个。
public class Demo03 {
public static void main(String[] args) {
/*输出1-1000以内能被5整除的数且每行输出20个*/
for (int i = 1; i <=1000; i++) {
if(i%5==0){
System.out.print(i+"\t");//因为我们要求每行输出固定个数所以不能直接用println()
//= System.out.print(i) + System.out.print(" ");
/*每行输出20个*/
if (i%(5*20)==0){
System.out.println();
//= System.out.print("\n");
}
}
/*println()输出完换行
* print()输出完不换行
* */
}
}
}
输出结果:
5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100
105 110 115 120 125 130 135 140 145 150 155 160 165 170 175 180 185 190 195 200
205 210 215 220 225 230 235 240 245 250 255 260 265 270 275 280 285 290 295 300
305 310 315 320 325 330 335 340 345 350 355 360 365 370 375 380 385 390 395 400
405 410 415 420 425 430 435 440 445 450 455 460 465 470 475 480 485 490 495 500
505 510 515 520 525 530 535 540 545 550 555 560 565 570 575 580 585 590 595 600
605 610 615 620 625 630 635 640 645 650 655 660 665 670 675 680 685 690 695 700
705 710 715 720 725 730 735 740 745 750 755 760 765 770 775 780 785 790 795 800
805 810 815 820 825 830 835 840 845 850 855 860 865 870 875 880 885 890 895 900
905 910 915 920 925 930 935 940 945 950 955 960 965 970 975 980 985 990 995 1000
打印九九乘法表
样式:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
思考过程:
- 打印第一列。发现每个式子其实就是
1*行数i
。 - 我们发现第二列第三列到第九列依次是
列数*i
因此想到列数j与行数i可做循环的嵌套。每个式子其实就是j*i
. - 又因为格式中列数<=行数,即j<=i 。故而想到
for (int i = 1; i < 10; i++) {
for(int j = 1; j<=i ;j++){
System.out.print(j+"*"+i +"=" + (j*i) +" ");
}
}
- 最后调整样式:每两个式子中间有空格.另外i每次循环到9后要换行。
for (int i = 1; i < 10; i++) {
for(int j = 1; j<=i ;j++){
System.out.print(j+"*"+i +"=" + (i*j) +" ");
}
System.out.println();
}
- 最后实现完整代码:
public class Demo04 {
public static void main(String[] args) {
/*打印九九乘法表*/
for (int i = 1; i < 10; i++) {
for(int j = 1; j<=i ;j++){
System.out.print(j+"*"+i +"=" + (j*i) +" ");
}
System.out.println();
}
}
}
输出结果:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
增强型for循环
Java5引入了一种主要用于数组或集合的增强型for循环。
增强型for循环语法格式如下:
for(声明语句:表达式){
//代码句
}
- 声明语句:声明新的局部变量,该变量类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
- 表达式:表达式是要访问的数组名或是返回值为数组的方法。
看个简单的例子体验一下for和增强for的关联:
public class Demo05 {
public static void main(String[] args) {
//定义了一个数组
int[] num = {1,2,3,4,5};
//遍历数组的元素
//for(声明语句与数组元素的类型匹配:表达式是访问的数组名或返回值为数组的方法)
for(int x:num){
System.out.println(x);
}
System.out.println("=============");
for (int i = 0; i < 5; i++) {
System.out.println(num[i]);
}
}
}
输出结果:
1
2
3
4
5
=============
1
2
3
4
5
break和continue
- break用于控制循环的流程,可用于任何循环语句的主体部分。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)
- continue语句用在循环语句体中用于终止某次循环过程。即跳过循环体中尚未执行的语句,直接进入下一次执行循环的判定。
看一个break的例子:
输出0-30之间的数
public class BreakDemo {
public static void main(String[] args) {
int i = 0;
while (i<100){
i++;
System.out.println(i);
if (i==30){
break;
}
}
}
}
输出结果:
1
2
3
...
30
看一个continue的例子:
跳过整十数输出1-100:
public class ContinueDemo {
public static void main(String[] args) {
int i = 0;
while (i<100){
i++;
if (i%10==0){
System.out.println();//每当循环到10的倍数就会换行
continue;
//continue直接跳过了System.out.print(i)的执行,直接进入下一次循环的判定。
// 故而每次遇到10的倍数就不会输出。每一行最多输出到9
}
System.out.print(i + " ");
}
}
}
输出结果:
1 2 3 4 5 6 7 8 9
11 12 13 14 15 16 17 18 19
21 22 23 24 25 26 27 28 29
31 32 33 34 35 36 37 38 39
41 42 43 44 45 46 47 48 49
51 52 53 54 55 56 57 58 59
61 62 63 64 65 66 67 68 69
71 72 73 74 75 76 77 78 79
81 82 83 84 85 86 87 88 89
91 92 93 94 95 96 97 98 99