从JDK5之后,Java提供了一种更简单的循环:foreach循环,也叫作增强for循环,这种循环遍历数组和集合更加简洁。使用foreach循环遍历数组和集合元素时,无需获得数组或集合的长度,无需根据索引来访问数组元素或集合元素,foreach循环自动遍历数组或集合的每个元素。
foreach循环的语法格式如下:
for(type variableName:array|collection){
//variableName自动迭代访问每个元素
}
在上面语法格式中,type是数组元素或集合元素的类型,variableName是一个形参名,foreach循环将自动将数组元素、集合元素依次赋给该变量。下面程序示范了如何使用foreach循环遍历数组元素:
public class ArrDemo{
public static void main(String[] args){
int[] arr = {1,2,3,4,5,6,7};
for(int num : arr){
System.out.println(num);
}
}
}
编译并运行这个程序,控制台将显示如图1所示的信息。
图1 ArrDemo运行结果
上面的代码使用foreach循环依然可以遍历了数组中的每个元素并输出在控制台,而无需获得数组的长度,也无需根据索引来访问数组元素,foreach循环和普通的循环不同的是,它无须循环条件,无须循环迭代语句,这些部分都由系统来完成,foreach循环自动迭代数组的每个元素,当每个元素都被迭代一次后,foreach循环自动结束。
当使用foreach循环来迭代输出数组元素或集合元素时,通常不要对循环变量进行赋值,虽然这种赋值语句在语法上是允许的,但是没有太大的意义,而且极容易引起错误。例如下面的程序。
public class ForEachArrError{
public static void main(String[] args){
String[] books = {"Java从入门到出家",
"Oracle从入门到删库跑路","PHP从入门到出轨"};
for(String book : books){
book = "C语言从入门到抑郁症康复";
System.out.println(book);
}
System.out.println(books[0]);
}
}
编译并运行这个程序,控制台将显示如图2所示的信息。
图2 ForEachArrError运行结果
从上面运行结果看,由于在foreach循环中对数组元素进行赋值,结果导致不能正确遍历数组元素,不能正确地取出每个数组元素的值。而且当再次访问第一个素组元素时,发现数组元素的值依然没有改变。不难看出,当使用foreach来迭代访问数组元素时,foreach中的循环变量相当于一个临时变量,系统会把数组元素一次赋给这个临时变量,而这个临时变量不是数组元素,它只是保存了数组元素的值。因此,如果希望改变数组元素的值,则不能使用这种foreach循环。