目录
3.3 、循环结构
循环语句能够使程序代码在满足条件时重复执行,适用于需要重复一段代码直到满足特定条件为止的情况。
循环结构一般由四部分组成:
-
初始化部分:在循环开始之前执行,用于初始化某些数据
-
循环条件:boolean表达式,决定是否执行循环体,如过这个表达式永远为true,则会无限循环,这就是常说的死循环。
-
循环体:循环的主体,用来不断循环的代码
-
迭代:循环体每次循环后,通过迭代部分改变循环的条件,使循环在合适的时候结束,不至于处于死循环状态。
而一个循环体结束的方式有两种:循环条件返回false、通过关键字break。
3.3.1、while循环
while也叫条件判断语句,它通过一个条件来决定内部的语句是否重复执行。
先定义迭代的变量
while(布尔表达式进行判断){ //如果表达式的值为true,则执行循环,否则推迟循环。如果恒为true,则循环进入死循环
循环体
迭代条件 //为了不进入死循环的状态,循环内需要不断改变表达式的条件,从而让循环有失效的时候产生(一定不要忘记)
}
while循环还有一种使用场景:在循环次数不确定的使用,可以将条件设定为true,在循环中进行条件的判断,然后利用关键字 break 跳出循环。
while(true){
循环体
if(判断条件){
break;
}
}
while循环的关键点:
- 循环条件检查:在每次循环开始前都会检查条件。
- 无限循环:如果条件永远为 true,则会创建一个无限循环。为了避免无限循环,需要确保循环体内有改变条件的代码,使其最终能够变为 false。
- 循环控制变量:通常需要一个循环控制变量来控制循环的次数。
- 循环体:至少应该有一条语句在循环体内,如果没有实际的语句执行,可以使用空语句(
;
)。- while 循环特别适用于不知道确切循环次数的情况,只知道循环需要在满足特定条件时继续执行。
3.3.2、do while
do while循环是while循环的一个变体,while循环是先判断条件,do循环是先执行一次循环体再判断条件。==所以do循环的循环体是至少被执行一次的。==do循环末尾是有分号的
先定义迭代的变量
do{ //先执行一次循环体,,再进行条件判断。所以do循环至少会执行一次
循环体
迭代条件
}while(布尔表达式);
- 至少执行一次:
do-while
循环保证循环体至少执行一次,即使条件第一次检查时就为false
。- 循环条件的检查:循环条件是在循环体执行后进行检查的。
- 循环控制变量:和
while
循环一样,通常需要一个循环控制变量来控制循环的次数。- 分号:在
do-while
循环中,while
语句的末尾需要一个分号(;
)。
3.3.3、for循环
for循环属于最常用的循环,它能精确的控制循环的次数,是循环中最灵活、有效的一种结构。在java 5版本后还增加了foreach的语法,通常使用在数组、集合的遍历中。
1、for循环
for循环中有四个部分:第一部分通常是对计数器的初始化,该计数器可以确定循环次数。第二部分给出每次新一轮循环执行前要检测的循环条件。第三部分说明如何更改计数器。第四部分就是循环体
for(初始表达式 ; 布尔表达式 ; 操作表达式){ //(int i = 0; i<10; i++),满足条件则执行循环
循环体
}
//初始表达式:负责对变量进行初始化
//布尔表达式:负责循环是否执行
//操作表达式:负责修改变量,避免造成死程序
//三个表达式都可以为空语句(分号不能省略),三者均为空的时候,相当于一个无限死循环。
- for在执行时,先初始化表达式,该初始化表达式只在循环开始前执行一次。
- 初始化完成后,第一次循环会直接进行布尔表达式的判断,成立则执行循环体,不成立直接结束循环。
- 循环体每次循环结束后,会执行操作表达式改变条件,改变完成后,再通过布尔表达式判断是否循环,一直到表达式判断为false。
for循环一样可以在无法确定循环次数时使用:
for(;;){
if(条件){
break;
}
}
for循环和while循环是可以相互转换的,但是它们的初始化条件的作用域不同,for的初始化变量是定义在循环中的,只能在for的内部使用,而while的初始变量时在循环外部定义的,即便是跳出了while循环体,此变量在该方法中依然可以使用。当然如果把for循环的初始化变量定在for外,那么它和while就很类似了
如果使用浮点数作为循环的条件,那么该循环可以能会因为精度的关系导致成为死循环。
2、forEach循环
在Java5后,Java提供了一种更简单的循环 forEach,forEach是for语句的一种简化版本,但是不能取代for循环,任何的forEach语句都能转换成for语句。forEach主要用于数组或集合的遍历。
因为forEach 无需知道数组或集合的长度,也无需索引来访问数据,它会自动遍历所有元素。
//常用于数组等集合性的数据,可以直接遍历集合内的元素,缺点是无法知道数据的索引下标
for(类型 变量名 : 集合的变量名){
//循环体
}
需要注意的是在forEach循环中,不要对循环的变量从新赋值,forEach 在循环中会为数组或集合中的元素生成一个临时变量,然后将数组集合内元素赋值给临时变量,所以如果操作临时变量不但不会改变数组和集合中的元素值,还会导致不能正确遍历元素。
3.3.4、循环嵌套
循环嵌套就是在一个循环A的循环体中再声明一个循环B。它的执行顺序是:外层的循环体迭代一次,内层的循环会完整的遍历执行一遍,外层迭代几次,内层循环就完整的遍历几次。
for(int i=0; i<5; i++){ //外层循环5此
for(int j=0; j<5; j++){ //内层循环5*5次
}
}
3.3.5、循环的关键字
在循环中常用的关键字为:continue 、break。主要用于对循环语句的控制。
1、continue
continue 适用于任何循环控制结构中。作用是终止正在循环中的这次循环,回到循环中改变变量的表达式,然后进入到下一次循环。
当循环语言嵌套时,跳出的循环包裹 continue 最近的一个循环体。
如果想让 continue 跳出外层循环,需要给外循环添加一个标签才行,标签格式 标识符:
,然后用 continue 标签;
结束外层循环。这个标签必须在 continue 所在循环的外层循环之前定义。
2、break
break 主要用在循环语句
或者 switch 语句
中,程序遇到break时,就会直接跳出整个语句块、结束switch语句、或者终止整个循环
。
当循环语言嵌套时,跳出的循环包裹 break 最近的一个循环体。
如果想让break跳出最外层的循环,需要给外循环添加一个标签才行,标签格式 标识符:
,然后用 break 标签;
结束外层循环。这个标签必须在break所在循环的外层循环之前定义。
3、return
在循环中常用的关键字就是break和 continue 两个,但是还有一个return关键字,它并不是用来结束循环的,而是直接结束整个方法。
因为一般我们都是在方法中写代码,所以如果循环中有return关键字,一样可以将循环结束,不仅如此,循环后的代码也不会执行了,因为整个方法都直接终止运行了。