Java核心技术速学版(第3版)
上QQ阅读APP看书,第一时间看更新

1.7.3 循环

while循环会依据具体的条件,反复执行其循环体的语句。例如,假定有一个对数值求和的任务,直到数值的总和达到目标值。我们将使用随机数生成器作为数值的来源,其由java.util包中的Random类提供:

var generator = new Random();

下面的调用将会生成0~9的一个随机整数:

int next = generator.nextInt(10);

以下是用于求和的循环:

while(sum < target) {
     int next = generator.nextInt(10);
     sum += next;
     count++;
}

这是while循环的典型用法。当总和小于目标值时,循环会持续执行。

有时你需要先执行循环体,然后才能评估循环条件。假设你想知道达到特定值所需的具体时间,那么在测试循环条件之前,需要先进入循环并获取到那个测试值。在这种情况下,要使用do/while循环:

int next;
do {
     next = generator.nextInt(10);
     count++;
} while (next != target);

这样就可以先进入循环体,再设定next的值,然后再评估是否满足循环条件。只要满足循环条件,循环体就会重复执行。

在前面的示例中,循环迭代的次数都是未知的。然而,在实践中的许多循环中,循环迭代的次数都是固定的。在这些情况下,最好使用for循环。

例如,下面示例中的循环计算固定数量的随机值之和:

for (int i = 1; i <= 20; i++){
     int next = generator.nextInt(10);
     sum += next;
}

这个循环将会执行20次,每次循环迭代中,i分别会被设置为1、2、……、20。

可以将任何一个for循环重写为while循环。上面的循环等效于:

int i = 1;
while (i <= 20){
     int next = generator.nextInt(10);
     sum += next;
i++;
}

在while循环中,变量i的初始化、测试和更新分散在循环体的不同位置。而使用for循环,变量i的初始化、测试和更新可以很紧凑地聚集在一起。此外,for循环中变量的初始化、测试和更新可以采用任意形式。例如,当一个值小于目标值时,可以将其加倍:

for (int i = 1; i < target; i *= 2) {
     System.out.println(i);
}

也可以不在for循环的头部声明变量,而是初始化现有变量:

for (i = 1; i <= target; i++) // Uses existing variable i

或者可以声明或初始化多个变量并提供多个变量的更新,用逗号分隔。例如:

for (int i = 0, j = n - 1; i < j; i++, j--)

如果不需要初始化或更新,那么也可以将其留空。如果忽略该条件,则认为该条件总是为true:

for (;;) // An infinite loop

你将在下一小节中看到如何退出这种无限循环。