4.5.5 foreach循环

4.5.5 foreach循环

Java5之后,Java提供了一种更简单的循环:foreach循环,这种循环遍历数组和集合更加简洁。
使用toread-h循环遍历数组和集合元素时,无须获得数组和集合长度,无须根据索引来访问数组元素和集合元素,foreach循环自动遍历数组和集合的每个元素。

foreach循环的语法格式

foreach循环的语法格式如下:

1
2
3
for(type variableName : arrayName){
// variableName自动迭代访问每个元素
}

在上面语法格式中,type是数组元素或集合元素的类型,variableName是一个形参名,foreach循环将自动将数组元素、集合元素依次赋给该变量。

程序示例

下面程序示范了如何使用foreach循环来遍历数组元素。

1
2
3
4
5
6
7
8
9
10
public class ForEachTest {
public static void main(String[] args) {
String[] books = { "Hello", "World", "Java" };
// 使用foreach循环来遍历数组元素,
// 其中book将会自动迭代每个数组元素
for (String book : books) {
System.out.println(book);
}
}
}

从上面程序可以看出,使用foreach循环遍历数组元素时无须获得数组长度,也无须根据索引来访问数组元素foreach循环和普通循环不同的是,它无须循环条件,无须循环迭代语句,这些部分都由系统来完成,foreach循环自动迭代数组的每个元素,当每个元素都被迭代一次后,foreach循环自动结束。

不要对foreach循环变量赋值

当使用foreach循环来迭代输出数组元素或集合元素时,通常不要对循环变量进行赋值,虽然这种赋值在语法上是允许的,但没有太大的实际意义,而且极容易引起错误。
例如下面程序:

1
2
3
4
5
6
7
8
9
10
11
public class ForEachErrorTest {
public static void main(String[] args) {
String[] books = { "Hello", "World", "Java" };
// 使用foreach循环来遍历数组元素,其中book将会自动迭代每个数组元素
for (String book : books) {
book = "JSP";
System.out.println(book);
}
System.out.println(books[0]);
}
}

运行上面程序,将看到如下运行结果:

1
2
3
4
JSP
JSP
JSP
Hello

从上面运行结果来看,在foreach循环中对数组元素进行赋值,则不能正确遍历数组元素,不能正确地取出每个数组元素的值。
而且当再次访问第一个数组元素时,发现数组元素的值依然没有改变。

foreach的循环变量是临时变量 不是数组元素

使用foreach来迭代访问数组元素时,foreach中的循环变量相当于一个临时变量,系统会把数组元素依次赋给这个临时变量,而这个临时变量并不是数组元素,它只是保存了数组元素的值。因此,如果希望改变数组元素的值,则不能使用这种foreach循环
使用foreach循环迭代数组元素时,并不能改变数组元素的值,因此不要对foreach的循环变量进行赋值