【Java基础】循环
1. 循环的四个要素
- 循环体:指要循环执行的语句
- 循环条件:指能使得循环继续进行下去的条件,必须为
boolean
类型 - 初始条件:指循环开始前的变量初始化,一般为循环控制变量的初始化
- 迭代条件:指一次循环结束后对循环控制变量进行更改的语句
通常情况下,循环结束都是因为循环条件语句返回了false
2. 三大循环语句
2.1 for循环
for(初始条件 ; 循环条件 ; 迭代条件){
循环体;
}
for循环各个要素执行的顺序如下:
初始条件 -> 循环条件 -> 循环体 -> 迭代条件 -> 循环条件 -> 循环体 ......
2.2 while循环
初始条件
while(循环条件){
循环体;
迭代条件;
}
while循环各个要素执行顺序如下(与for循环相同):
初始条件 -> 循环条件 -> 循环体 -> 迭代条件 -> 循环条件 -> 循环体 ......
注意:编写while循环时一定要注意不要漏掉迭代条件
for与while的总结:
- 实际开发过程中,一般会总for和while中进行选择以实现循环结构。
- for循环和while循环可以相互转换,具体使用哪个取决于实际开发环境:遍历数组和字符串一般使用for循环,若初始条件较多较复杂,则优先选用while。
- for循环与while循环的区别是初始条件的作用范围不同。
- 写程序过程中一定要避免产生死循环。
2.3 do-while循环
初始条件
do{
循环体;
迭代条件;
}while(循环条件);
do-while循环各个要素执行顺序如下(先执行一遍循环体再进行循环条件判断):
初始条件 -> 循环体 -> 迭代条件 -> 循环条件 -> 循环体 ......
说明:
- do-while 循环至少会执行一次循环体
- 开发中较少使用do-while结构
3. “无限”循环结构——while(true) 与 for(;;)
注意:理论上应当避免这种写法,但是在某些特殊场景使用这些很方便,比如对循环次数不确定的情况,大多用在系统底层或者嵌入式开发中。使用这一结构时一定要在循环体中添加一定条件下的退出循环操作:
- 方式一:将循环条件置位false
- 方式二:执行break
4. 循环嵌套
4.1 概念:将一个循环A声明在另一个循环结构B的循环体中
- 内层循环:循环结构A
- 外层循环:循环结构B
4.2 说明:
- 内层循环结构遍历一遍,相当于外层循环体执行了一次
- 假设外层循环需要执行
m
次,内层循环需要执行n
次,此时内层循环的循环体一共执行了m*n
次 - 外层循环控制行数,内层循环控制列数
4.3 典型例子:
4.3.1. 打印乘法表
/*
* 打印9 9乘法表
* */
public class NineNineTable {
public static void main(String[] args) {
int num = 99;
for (int i = 1; i <= num; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j+"*"+i+"="+(i*j)+"\t");
}
System.out.println();
}
}
}
4.3.2. 输出100以内的质数
/*
* 质数输出
* */
public class PrimeNumberTest2 {
public static void main(String[] args) {
boolean isPrime;
for (int i = 2; i <= 100000; i++) {
isPrime = true;
for (int j = 2; j <= Math.sqrt(i); j++) {// 优化点二:仅遍历到当前数的二分之一次方即可
if (i % j == 0) {
isPrime = false;
break;//优化点一,可以减少没意义的遍历,只对非质数有效
}
}
if (isPrime) {
System.out.println(i );
}
}
}
}
5. break与continue
使用范围 | 循环中的作用 | 相同点 | |
---|---|---|---|
break | switch-case,循环结构中 | 结束当前循环 | 关键字后不能声明语句 |
continue | 循环机构中 | 结束当次循环 | 关键字后不能声明语句 |
还有一种带标签的break和continue,其使用较少,对代码的可读性有一定影响。
6. 补充:如何衡量一个代码的优劣
- 正确性:代码运行后要得到正确的结果。
- 可读性:代码一定要逻辑清晰,易被他人和日后的自己读懂,对bug的修改和工作的交接有很重要的作用。
- 健壮性:对于异常输入要有对应的处理。
- 高效率与低存储:运行速度要尽可能快,运行内存要尽可能低,即时空复杂度概念。