循环结构
- 前面我们实现的功能中,都是顺序执行语句,但如果需要把一句话输出100次,再用顺序执行语句就是个体力活了。这时候我们可以使用循环结构,常见的循环体语句有for循环,while循环,do-while循环语句。
- 循环结构:循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句。当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环。
for循环结构:for([初始表达式],[布尔表达式],[步进表达式]){循环体内执行语句}
- 初始化表达式可以为循环体定义一个新的变量并赋予一个初始值,一般是int变量。每次循环开始前,都会判断布尔表达式,如果为true则执行循环,如果为false则跳出并中断当前循环;一般布尔表达式中判断的变量即为初始化表达式中定义的变量。步进表达式是一种给布尔表达式中判断的变量进行变更的操作,一般是数值的增加或减少,以使循环语句可以被跳出并中断。每次循环结束时会执行一次步进表达式。循环代码体中,可以根据定义的int变量按序列去访问数据,如每次循环时按序列访问数组中的各个元素。
- 注:一般只初始化一次。
public class Test6 {
public static void main(String[] args) {
for (int i = 1; i < 5; i++) {
System.out.println("for循环可以方便打印多行语句,i="+i);
}
}
}
运行结果:
for循环可以方便打印多行语句,i=1
for循环可以方便打印多行语句,i=2
for循环可以方便打印多行语句,i=3
for循环可以方便打印多行语句,i=4
- for循环在IDEA中的简写:数字.fori。一般地,数字是上限,自变量默认为i(可以更改),且是从0开始的。例如,在IDEA中输入:5.fori,点击回车键,出来的是:
for (int i = 0; i < 5; i++) {
}
while循环结构:
while([布尔表达式]){
//循环体内语句
}
- while语句每次会循环开始前会判断布尔表达式,值为true则会继续执行循环体内的语句,直到布尔表达式的值为false为止。
public class Test4 {
public static void main(String[] args) {
int i=1;
while(i<5){
System.out.println("目前i的值是"+i);
i++;
}
}
}
结果:
目前i的值是1
目前i的值是2
目前i的值是3
目前i的值是4
do-while循环语句
do{
//循环体内执行语句
}while([布尔表达式]);
- do-while语句与简单while语句类型不同的是:在第一次执行时,do-while中的语句至少会执行一次,即便布尔表达式第一次的值就为false;而在简单while语句中,当布尔表达式第一次的值为false时后面的语句就不会被执行。
public class Test5 {
public static void main(String[] args) {
int i=1;
do{
System.out.println("目前i的值是"+i);
i++;
}while (i < 5);
}
}
运行结果:
目前i的值是1
目前i的值是2
目前i的值是3
目前i的值是4
跳转语句
continue 语句
- 当循环语句执行到某一次循环,满足了某种条件并希望不再执行后面未执行的语句,而是直接跳到下一次循环时,可以使用continue关键字。continue并不是直接跳出整个循环语句,而是跳出当前的这次循环进人到下一次的循环中,循环语句中原有的布尔表达式仍需要进行判断。
注:如果是多个循环嵌套,内层循环语句中的continue语句只能中断当前循环,并不能影响到外层循环语句。
public class Test3_Break {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
if(i==3){
continue;//跳出当前循环语句,执行下一次。会输出i=4
}
System.out.println("此时i="+i);
}
}
}
运行结果:
此时i=0
此时i=1
此时i=2
此时i=4
Break语句
- Break关键字可以直接跳出当前循环。和continue不同的是,break语句是直接终止所有的循环语句,跳出循环体。
- 和continue一样,多个循环嵌套中,内层循环语句的break语句只能中断内部循环,并不能影响到外层循环语句。
public class Test3_Break {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
System.out.println("此时i="+i);
if(i==3){
break;//跳出循环语句,不会输出i=4
}
}
}
}
运行结果:
此时i=0
此时i=1
此时i=2
此时i=3
Return语句
- return语句有两个用途,一个是定义一个方法的返回值(void方法也有一个隐式的return语句),另一个是直接跳出当前方法。所以,return语句也可以用来跳出当前所有的嵌套循环体。
- 实际编程中会有这样一种情况:
需要让程序跳出指定的循环语句。Java中提供了标签,一般定义在循环语句之前,用来标识当前循环。这相当于给当前循环起了一个名字以便它可以被找到。设置标签的原因是:如果存在多个循环语句嵌套,break和continue只能跳出当前循环,但是使用标签后,程序就可以中断循环并直接跳转到标签所在的地方。
public class Test2 {
public static void main(String[] args) {
for1:
for (int i = 0; i < 5; i++) {
System.out.println("此时,i="+i);
for2:
for (int j = 0; j < 4; j++) {
System.out.print("此时,j="+j+"\t");
if(j==3){
break for1;//指定跳出外层循环
}
}
}
}
}
运行结果:
此时,i=0
此时,j=0 此时,j=1 此时,j=2 此时,j=3
无限循环
- 虽然循环语句给编程带来了方便,但若使用不当也会造成“无限噩梦”。循环语句中必须有条件判断语句,如果判断语句不存在或者判断语句永远为true,就会导致程序不能从循环的代码块中跳出并执行接下来的代码,这种场景就是无限循环(也称“死循环”)。
public class Test7 {
public static void main(String[] args) {
int i=1;
while (i < 5){
System.out.println("i的值是"+i);
//漏掉了步进表达式,i的值永远是1
}
}
}
- 实际生活中,没有一台电脑是具有无限内存的,如果没有限制,无限循环中就会产生较多的对象,并且在没有得到及时处理的时候就会导致系统内存泄漏,严重时更会使系统崩溃。在开发中,要避免出现无限循环,就需要谨慎设计循环判断条件,必要时还需要在关键地方设置break语句强行跳出循环语句,这样其他正常逻辑的代码块才会被执行。