上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
你将在下一小节中看到如何退出这种无限循环。