8.2.4 使用foreach循环遍历集合元素

8.2.4 使用foreach循环遍历集合元素

除了可以使用Iterator接口迭代访问Collection集合里的元素之外,使用Java 5提供的foreach循环迭代访问集合元素更加便捷。

JDK 1.5foreach循环需要注意的地方

不要修改foreach循环中的迭代变量的值

与使用Iterator接口迭代访问集合元素类似的是, foreach循环中的迭代变量也不是集合元素本身,系统只是依次把集合元素的值赋给迭代变量,因此foreach循环中修改迭代变量的值也没有任何实际意义.

迭代集合时集合不能改变

同样,当使用foreach循环迭代访问集合元素时,该集合也不能被改变,否则将引发ConcurrentModificationException异常。

程序 使用foreach循环 遍历Collection集合

如下程序示范了使用foreach循环来迭代访问集合元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.*;

public class ForeachTest {
public static void main(String[] args) {
// 创建集合、添加元素的代码与前一个程序相同
Collection<String> collection = new HashSet<String>();
collection.add("1");
collection.add("2");
collection.add("3");
collection.add("4");
for (String str : collection) {
System.out.println(str);
if (str.equals("2")) {
// str只是一个副本,对forEach循环的迭代变量赋值没有意义
str = "NewStr";
}
if (str.equals("3")) {
// 遍历集合时不可修改集合元素
// collection.remove(str);
}
}
System.out.println(collection);
}
}
1
2
3
4
5
1
2
3
4
[1, 2, 3, 4]

取消collection.remove(str);这行代码前面的注释.再次运行:

1
2
3
4
5
6
7
1
2
3
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1493)
at java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1516)
at ForeachTest.main(ForeachTest.java:11)

上面代码使用foreach循环来迭代访问Collection集合里的元素更加简洁,这正是JDK 1.5foreach循环带来的优势。