循环
目标
- 了解循环的用途
- 为 for、while 和 do...while 语句使用正确的语法
- 了解如何打破循环,或者跳过循环迭代并继续
什么是循环?
有时您希望代码在工作完成之前反复做同一件事。可使用循环 实现此目的。循环是一种编程结构,它在满足某个特定条件(或某组条件)时反复执行。例如,您可能要求程序读取数据文件中的所有记录,或者依次处理数组中的每个元素。(下一单元将介绍数组。)
3 种循环结构使迭代代码或多次执行它成为可能:
- for 循环
- while 循环
- do...while 循环
for 循环
Java 语言中基本的循环结构是 for 语句。可以使用 for 语句迭代一个值范围,以确定执行循环多少次。for 循环的抽象语法是:
for (initialization; loopWhileTrue; executeAtBottomOfEachLoop) {
statementsToExecute
}
在循环的开头,执行初始化语句(多个初始化语句可使用逗号分开)。只要 loopWhileTrue(一个必须计算为 true 或 false 的 Java 条件表达式)为 true,就会执行该循环。在循环的底部,执行 executeAtBottomOfEachLoop。
例如,如果希望清单 1 中的 main() 方法中的代码执行 3 次,可以使用一个 for 循环
清单 1. 一个 for 循环
public static void main(String[] args) {
Logger l = Logger.getLogger(Person.class.getName());
for (int aa = 0; aa < 3; aa++) {
Person p = new Person("Joe Q Author", 42, 173, 82, "Brown", "MALE");
l.info("Loop executing iteration# " + aa);
l.info("Name: " + p.getName());
l.info("Age:" + p.getAge());
l.info("Height (cm):" + p.getHeight());
l.info("Weight (kg):" + p.getWeight());
l.info("Eye Color:" + p.getEyeColor());
l.info("Gender:" + p.getGender());
}
}
在清单 1 的开头,局部变量 aa 被初始化为 0。此语句仅在循环初始化时执行一次。该循环然后继续执行 3 次,每次将 aa 递增 1。
在下一单元将会看到,可使用一种替代性的 for 循环语法来循环执行实现 Iterable 接口的结构(比如数组和其他 Java 实用程序类)。就现在而言,只需注意 清单 1 中的 for 循环语法的用法。
一个 while 循环
while 循环的语法是:
while (condition) {
statementsToExecute
}
正如您可能预料到的,如果 condition 计算为 true,则执行该循环。在每个迭代的顶部(也即在执行任何语句之前),计算该条件。如果该条件计算为 true,则执行循环。所以如果一个 while 循环的条件表达式至少有一次未计算为 true,则可能不执行该循环。
再次看看 清单 1 中的 for 循环。作为对比,清单 2 使用了一个 while 循环来获取同样的结果。
清单 2. 一个 while 循环
public static void main(String[] args) {
Logger l = Logger.getLogger(Person.class.getName());
int aa = 0;
while (aa < 3) {
Person p = new Person("Joe Q Author", 42, 173, 82, "Brown", "MALE");
l.info("Loop executing iteration# " + aa);
l.info("Name: " + p.getName());
l.info("Age:" + p.getAge());
l.info("Height (cm):" + p.getHeight());
l.info("Weight (kg):" + p.getWeight());
l.info("Eye Color:" + p.getEyeColor());
l.info("Gender:" + p.getGender());
aa++;
}
}
可以看到,while 循环需要的工作比 for 循环要多。您必须初始化 aa 变量,还要记住在循环底部递增它。
do...while 循环
如果想要一个始终执行一次,然后 检查它的条件表达式的循环,可以使用 do...while 循环,如清单 3 所示。
清单 3. 一个 do...while 循环
int aa = 0;
do {
Person p = new Person("Joe Q Author", 42, 173, 82, "Brown", "MALE");
l.info("Loop executing iteration# " + aa);
l.info("Name: " + p.getName());
l.info("Age:" + p.getAge());
l.info("Height (cm):" + p.getHeight());
l.info("Weight (kg):" + p.getWeight());
l.info("Eye Color:" + p.getEyeColor());
l.info("Gender:" + p.getGender());
aa++;
} while (aa < 3);
条件表达式 (aa < 3) 在循环结束前不会执行检查。
循环终止
有时,您需要在条件表达式计算为 false 之前跳出(或终止)循环。如果在一个 String 数组中搜索某个特定值,而且只想找到该值,并不关心数组的其他元素,则可能发生这种情况。对于想要跳出循环的情况,Java 语言提供了 break 语句,如清单 4 所示。
清单 4. 一条 break 语句
public static void main(String[] args) {
Logger l = Logger.getLogger(Person.class.getName());
int aa = 0;
while (aa < 3) {
if (aa == 1)
break;
Person p = new Person("Joe Q Author", 42, 173, 82, "Brown", "MALE");
l.info("Loop executing iteration# " + aa);
l.info("Name: " + p.getName());
l.info("Age:" + p.getAge());
l.info("Height (cm):" + p.getHeight());
l.info("Weight (kg):" + p.getWeight());
l.info("Eye Color:" + p.getEyeColor());
l.info("Gender:" + p.getGender());
aa++;
}
}
break 语句跳转到它所在循环外的下一条可执行语句。
继续执行循环
在 清单 4 中的(简化)例子中,您仅希望执行循环一次并跳出。也可跳过循环的单次迭代,但继续执行循环。要实现该目的,需要使用 continue 语句,如清单 5 所示。
清单 5. 一条 continue 语句
public static void main(String[] args) {
Logger l = Logger.getLogger(Person.class.getName());
int aa = 0;
while (aa < 3) {
if (aa == 1)
continue;
else
aa++;
Person p = new Person("Joe Q Author", 42, 173, 82, "Brown", "MALE");
l.info("Loop executing iteration# " + aa);
l.info("Name: " + p.getName());
l.info("Age:" + p.getAge());
l.info("Height (cm):" + p.getHeight());
l.info("Weight (kg):" + p.getWeight());
l.info("Eye Color:" + p.getEyeColor());
l.info("Gender:" +
p.getGender());
}
}
在清单 5 中,跳过了循环的第二次迭代,但继续执行第三次迭代。举例而言,在处理记录并遇到一条您完全不想处理的记录时,使用 continue 就很方便。您可以跳过该记录并前进到下一条记录。