在开发时,我们会有许多带有规律性的重复指令需要计算机来完成,因此我们需要使用循环语句
循环语句由循环体和终止条件组成
前测试语句
先判断再执行
后测试语句
先执行或先定义,再判断
for循环
语法:
for(表达式1;表达式2;表达式3){
循环体;
}
for循环语句属于前测试语句,基本步骤如上分3步
1.初始化(initialize):表达式1,定义循环的初始值,只在循环开始时执行初始化一次
2.测试(test):进入表达式2,判断循环条件是否成立,为 true 就进入循环体
3.递增(increment):执行完循环体返回到表达式2,再次检查循环条件是否成立,仍然为true则执行表达式3(迭代),自增
可以看出for循环适用于明确次数时使用,也可以用来遍历数组,在这里还介绍增强for
增强for概述(for each)
语法:
for(集合或者数组元素的类型 变量名 : 集合对象或者数组对象){
引用变量名的java语句;
}
1.适用性
- 适用于集合和数组的遍历。
2.局限性:
- 集合不能为null,因为底层是迭代器。
- 隐藏了迭代器,所以在遍历集合时不能对集合进行修改(增删)。
- 不能获取下标
while循环
语法:
while(条件表达式){
循环语句块;
}
while循环语句也属于前测试语句
对比for循环
while循环表达式中放入布尔值,更能简便的达到不限次数、无限循环
对比for循环,针对的问题不同
do while 循环
语法:
do{
循环语句块;
}while(条件表达式);
do while语句是一种后测试循环语句,即在循环体执行后才会测试出口条件,说通俗点,对比while,do while 至少执行一次,条件在循环体执行结束后判断
三种循环的比对
- for循环适用于明确知道循环的次数
- while循环适用于不知道循环的具体次数,只知道达到某个条件的时候循环结束
- do-while循环适用于不知道循环的具体次数但至少要执行一次,只知道达到某个条件的时候循环结束
打断循环
打断循环有俩个关键字
break、continue
break
在循环结构中,用break语句跳出本层循环体,从而提前结束本层循环
for (int i = 0; i < 10; i++) {
if (i == 3) {
break;
}
System.out.println(i); // 0 1 2
}
当i自增到3,进入if条件时,执行break语句,直接跳出本次循环,所以我们看到输出从0开始,到2就停止了
continue
continue是结束本次循环(即跳过本次循环中余下尚未执行的语句),接着再一次进行循环条件的判定。
for (int i = 0; i < 10; i++) {
if (i == 3) {
continue;
}
System.out.println(i); // 0 1 2 4 5 6 7 8 9
}
同样,从输出结果可以看出,当i自增到3时,进入if语句,执行continue,但没有跳出循环,只是结束本次循环,后面不满足if语句,所以依然能执行
循环的嵌套
语法:
外层循环{
内层循环{}
}
我们用代码来看看嵌套循环的执行顺序
for (int i = 0; i < 3; i++) {
System.out.println("i" + i);
for (int j = 0; j < 10; j++) {
if (j == 3) {
break;
}
System.out.println("j:" + j);
}
System.out.println("内层跳出");
}
System.out.println("外层跳出");
/*i:0 j:0 j:1 j:2 内层跳出 i:1 j:0 j:1 j:2 内层跳出 i:2
j:0 j:1 j:2 内层跳出 外层跳出
//执行顺序:
*/
/*外层表达式1.初始化int i = 0; 满足i<3 到外层表达式4,代码往下走 输出i(0) int j = 0;
------------------------------------------------------------------------------------------------------------
满足j < 10 到内层表达式4不满足j == 3代码往下走 输出j(0) j ++(0+1)
------------------------------------------------------------------------------------------------------------
满足j < 10 不满足j == 3 输出j(1) 满足j < 10 不满足j == 3
------------------------------------------------------------------------------------------------------------
输出j(2) j++(2+1) 满足j < 10 满足j == 3,break打断循环代码往下走 输出内层跳出
------------------------------------------------------------------------------------------------------------
i++(0+1) 满足i < 3 输出i(1) int j = 0; 满足j < 10 不满足j == 3
------------------------------------------------------------------------------------------------------------
输出j(0) j++(0+1) 满足j < 10 不满足j == 3 输出j(1)
------------------------------------------------------------------------------------------------------------
j++(1+1) 满足j < 10 不满足j == 3 输出j(2) j++(2+1) 满足j < 10
------------------------------------------------------------------------------------------------------------
满足j == 3 输出内层跳出 i++(1+1) 满足i < 3 输出i(2) int j = 0
------------------------------------------------------------------------------------------------------------
满足j < 10 不满足j == 3 输出j(0) j++(0+1) 满足j < 10 不满足j == 3
------------------------------------------------------------------------------------------------------------
输出j(1) 满足j < 10 不满足j == 3 输出j(2) j++(2+1)
------------------------------------------------------------------------------------------------------------
满足j < 10 满足j == 3,break打断循环,回到i++(2+1) 不满足i < 3 输出内层跳出 输出外层跳出
------------------------------------------------------------------------------------------------------------
*/
注意点:
- 几重循环看的是循环嵌套的层级,而不是循环的个数;
- 在语法上循环嵌套的层次是可以无限的,但是在现实开发当中,最多达到三重循环;嵌套层次过多会导致程序流程控制力度下降,算法可读性降低;
- 嵌套循环的关键,在于搞清楚循环执行的顺序。外层循环执行1次,内层循环执行1圈;
内层循环可以访问外层循环的循环控制变量;
外层循环不能访问内层循环的循环控制变量; - 循环控制变量命名,最外层的用i,第二层用j,第三层用k,依次类推,这是“约定俗成”的规范; 同层循环可以使用同名的循环控制变量;
- break 和 continue,只能对本层循环起作用
(本文为接触Java不久的菜鸟所写,如有误区,还望各位大佬多多指教,菜鸟虚心受教)