在 Java 中,支持 for、while、do-while 和 for-each 四种循环语句。
for 循环是最常用的一种循环语句,语法格式如下:
for(<初始化表达式>; <循环条件表达式>; <迭代表达式>) <语句/语句块>
其中:
初始化表达式:在循环开始时执行一次,用于循环的准备工作,通常是赋值表达式或局部变量声明表达式
循环条件表达式:循环条件表达式的计算结果必须为布尔类型,用于给出循环运行的条件(true 则继续运行循环,false 则退出循环)。
迭代表达式:也称“增量表达式”,用于对循环变量进行简单的增量(++)/减量(--)操作。
语句/语句块:表示 for 的循环体,用于给出循环要完成的具体任务。
for 语句的执行过程如下:
(1)执行“语句1”
(2)进入 for 循环,开始执行 ①
(3)继续执行 ②
a、如果 ② 表达式返回 true,则执行 ③ 和 ④
b、如果 ② 表达式返回 false,退出循环
(4)执行“语句3”
示例:
public class Demo { public static void main(String[] args) { System.out.println("语句1"); for(int i = 0; i < 2; i++) { System.out.println("i=" + i); } System.out.println("语句2"); } }
上面代码中,先向控制台输出“语句1”字符串,然后进入 for 循环。在 for 循环中:
执行 “int i = 0;”语句,声明一个局部变量 i 且赋值为 0。注意,该语句只执行一次。
执行“i < 2;”语句,判断 i 是否小于 2。当前 i = 0,表达式等于 true,执行循环体,向控制台输出“i=0”,最后执行“i++”语句,将 i 加一增量操作。
执行“i < 2;”语句,判断 i 是否小于 2。当前 i = 1,表达式等于 true,执行循环体,向控制台输出“i=1”,最后执行“i++”语句,将 i 加一增量操作。
执行“i < 2;”语句,判断 i 是否小于 2。当前 i = 2,表达式等于 false,退出循环体。
最后,向控制台输出“语句2”字符串,程序结束。
运行示例,输出结果如下:
语句1 i=0 i=1 语句2
上面介绍了标准 for 循环语句的使用方式,for 还支持多种变种,如下:
省略初始化表达式
int i = 0; for(/* 被省略,分号需要保留 */; i < 10; i++) { System.out.println("i=" + i); }
省略循环条件表达式
如果省略循环条件表达式,则每次循环时将不判断循环条件,即认为条件一直为true,除非在循环体中使用 break 语句手动跳出循环,否则循环会成为“死循环”。
for(int i = 0; /* 被省略,分号需要保留,默认为 true */; i++) { if(i > 10) { // 当 i 大于 10 时,手动退出循环 break; } System.out.println("i=" + i); }
省略迭代表达式
省略迭代表达式时,应该在循环体中修改循环条件,否则成为“死循环”。
for(int i = 0; i < 10; /* 被省略,循环体中修改循环条件 */) { System.out.println("i=" + i); i++; }
同时省略初始化表达式和迭代表达式
int i = 0; for(/* 被省略 */; i < 10; /* 被省略 */) { System.out.println("i=" + i); i++; }
同时省略三个表达式
如果同时省略三个表达式,相当于 while(true) 死循环。
int i = 0; for(/* 被省略 */; /* 被省略 */; /* 被省略 */) { if(i > 10) { break; } System.out.println("i=" + i); i++; }
注意:for 语句的初始化表达式和迭代表达式都可以使用逗号分隔开的多个表达式组成的复合表达式,也称“逗号表达式”。循环条件表达式不能使用逗号分隔,但是可以使用复合表达式。例如:
for(int i = 0, j = 100; (i < 100 && j < 100); i++, j--) { int result = i + j; System.out.println(i + " + " + j + " = " + result); }
while 循环是典型的“当型循环”(当型循环指先执行条件判断,条件为true,才执行循环体)结构,语法格式如下:
while(<循环条件表达式>) <语句>
其中,循环条件表达式的计算结果必须为布尔值。while 循环语句执行过程为:先判断循环条件表达式的值,如果为 false,则结束循环。如果为 true,则执行循环体语句,循环语句执行完成后再次判断循环条件表达式。例如:
public class Demo { public static void main(String[] args) { // 保存和结果 int sum = 0; int i = 0; while(i < 100) { i++; // 计算和 sum += i; } System.out.println("sum=" + sum); } }
运行示例,输出结果如下:
sum=5050
do-while 循环是典型的“直到型循环”(直到型循环指先执行语句,然后才判断条件)结构,语法如下:
do <语句> while(<循环条件表达式>);
其中,先执行循环体语句,然后再判断循环条件表达式的值。如果为 false,则退出循环。如果为 true,则继续执行循环体语句。例如:
public class Demo { public static void main(String[] args) { int sum = 0; int i = 0; do { i++; sum += i; } while (i < 100); System.out.println("sum=" + sum); } }
运行示例,输出结果如下:
sum=5050
for-each 循环语句是从 JDK5.0 开始引入的一种增强型 for 循环结构,可以认为是 for 循环的一个变种,适合逐个处理数组或集合中的所有元素。语法如下:
for(<迭代变量声明> : <数组或集合>) <语句>
其中,<迭代变量声明> 用来声明一个局部变量,类似 for 语句的 <初始化表达式>。并且 for-each 语句将每次迭代的值赋值给<迭代变量声明>,在循环体中就可以使用该变量。例如:
public class Demo { public static void main(String[] args) { int[] arrays = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; for(int i : arrays) { System.out.println("i=" + i); } } }
运行示例,输出结果如下:
i=0 i=1 i=2 i=3 i=4 i=5 i=6 i=7 i=8 i=9
如果你在循环体中需要用到循环的索引值,则需要使用传统 for 语句。
一个循环语句的循环体中可以再包含循环语句,这种结构被称为嵌套循环结构。嵌套循环语句又称多重循环,循环语句的嵌套层次无限制,可以是两层、三层或多层。但是,建议不要超过三层,因为超过三层代码可读性会非常差。例如:
public class Demo { public static void main(String[] args) { // 外层循环 for(int i = 0; i < 10; i ++) { // 内层循环 for(int j = 0; j < i; j++) { System.out.print(j + "\t"); } System.out.println(); } } }
运行示例,输出结果如下:
0 0 1 0 1 2 0 1 2 3 0 1 2 3 4 0 1 2 3 4 5 0 1 2 3 4 5 6 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 8