Java程序中,在实际的代码里,程序经常需要做条件判断、循环,因此,需要有多种流程控制语句,来实现程序的跳转和循环等功能,其中,使用最广泛的是for循环。
for循环的功能非常强大,它使用计数器实现循环。for循环会先初始化计数器,然后,在每次循环前检测循环条件,在每次循环后更新计数器。(通常程序中是将计数器变量名命名为i)
下面举个简单的1到100求和:
public class Main {
public static void main(String[] args) {
int sum = 0;
for (int i=1; i<=100; i++) {
sum = sum + i;
}
System.out.println(sum);
}
}
可见for循环的用法是:
for (初始条件; 循环检测条件; 循环后更新计数器) {
// 执行语句
}
在for循环执行前,会先定义计数器变量为i并赋初始值为1(int = 1),然后,循环前先检查循环条件i<=100,循环后自动执行i++,因此,for循环是把更新计数器的代码统一放到了一起,在for循环的循环体内部,不需要去更新变量i。
for循环也可以对一整组的所有元素进行求和:
public class Main {
public static void main(String[] args) {
int[] ns = { 1, 3, 9, 11, 23 };
int sum = 0;
for (int i=0; i<ns.length; i++) {
System.out.println("i = " + i + ", ns[i] = " + ns[i]);
sum = sum + ns[i];
}
System.out.println("sum = " + sum);
}
}
执行后:
i = 0, ns[i] = 1
i = 1, ns[i] = 3
i = 2, ns[i] = 9
i = 3, ns[i] = 11
i = 4, ns[i] = 23
sum = 47
在上面代码中,循环条件是i<ns.length。因为ns数组的长度是5,因此,当循环5次后,i的值被更新为5,就不满足循环条件,因此for循环结束。
使用for循环时,计数器变量i要尽量定义在for循环中:
int[] ns = { 1, 3, 9, 11, 23 };
for (int i=0; i<ns.length; i++) {
System.out.println(ns[i]);
}
// 无法访问i
int n = i; // compile error!
如果变量i定义在for循环外:
int[] ns = { 1, 3, 9, 11, 23 };
int i;
for (i=0; i<ns.length; i++) {
System.out.println(ns[i]);
}
// 仍然可以使用i
int n = i;
那么,退出for循环后,变量i仍然可以被访问,只是这样就破坏了变量应该把访问范围缩到最小的原则。
看下面代码:
public class Main {
public static void main(String[] args) {
int[] ns = { 1, 3, 9, 11, 23 };
for (int i=0; i<ns.length; i++) {
System.out.println(ns[i]);
i = i + 1;
}
}
}
执行结果:
1
9
23
这段代码是在在for循环体内修改了计数器。虽然不会报错,但是,数组元素只打印了一半,原因是循环内部的i = i + 1导致了计数器变量每次循环实际上加了2(因为for循环还会自动执行i++)。
因此,在for循环中,不要修改计数器的值。计数器的初始化、判断条件、每次循环后的更新条件统一放到for()语句中可以一目了然。
for each循环
for循环经常用来遍历数组,因为通过计数器可以根据索引来访问数组的每个元素。但是,很多时候,我们实际上真正想要访问的是数组每个元素的值。Java还提供了另一种for each循环,它可以更简单地遍历数组。
和for循环相比,for each循环的变量n不再是计数器,而是直接对应到数组的每个元素。for each循环的写法也更简洁。但是,for each循环无法指定遍历顺序,也无法获取数组的索引。
public class Main {
public static void main(String[] args) {
int[] ns = { 1, 3, 9, 11, 23 };
for (int n : ns) {
System.out.println(n);
}
}
}
例子:
理由for循环计算π:
圆周率π可以使用公式计算:
π/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - …
public class Main {
public static void main(String[] args) {
double pi = 0;
for (double i = 1; i <= 9999999; i += 4) {
pi += 4/i;
pi -= 4/(i + 2);
}
System.out.println(pi);
}
}
执行结果:
3.1415924535897797