第四章:集合框架
4.3 遍历集合
在Java中,集合框架提供了多种方式来遍历集合中的元素。根据不同的集合类型和需求,可以选择合适的遍历方法。以下是常见的集合遍历方式:
1. 使用迭代器(Iterator)
迭代器是Java集合框架中用于遍历集合的标准方式。它提供了统一的方法来访问集合中的元素,而不需要关心集合的具体实现。
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("C++");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println(element);
}
特点:
- 适用于所有实现了
Iterable接口的集合类 - 可以在遍历过程中安全地删除元素(使用
iterator.remove()) - 只能单向遍历
2. 增强for循环(for-each)
Java 5引入了增强for循环,简化了集合的遍历语法。
for (String language : list) {
System.out.println(language);
}
特点:
- 语法简洁
- 适用于所有实现了
Iterable接口的集合 - 不能修改集合结构(添加/删除元素)
3. 使用ListIterator(仅List集合)
ListIterator是Iterator的子接口,专门为List集合设计,提供了双向遍历的能力。
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
// 反向遍历
while (listIterator.hasPrevious()) {
System.out.println(listIterator.previous());
}
特点:
- 可以双向遍历
- 可以在遍历过程中添加、修改或删除元素
- 仅适用于List集合
4. 使用forEach方法(Java 8+)
Java 8引入了函数式编程特性,集合类新增了forEach方法。
list.forEach(element -> System.out.println(element));
// 或使用方法引用
list.forEach(System.out::println);
特点:
- 代码简洁
- 支持Lambda表达式
- 并行流中可以自动并行处理
5. 遍历Map集合
Map集合的遍历方式略有不同,因为需要同时处理键和值。
Map<String, Integer> map = new HashMap<>();
map.put("Java", 1);
map.put("Python", 2);
map.put("C++", 3);
// 遍历键值对
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
// 遍历键
for (String key : map.keySet()) {
System.out.println(key);
}
// 遍历值
for (Integer value : map.values()) {
System.out.println(value);
}
// Java 8方式
map.forEach((k, v) -> System.out.println(k + ": " + v));
性能考虑
不同的遍历方式在性能上有所差异:
- 对于ArrayList,普通for循环(使用索引)通常最快
- 对于LinkedList,迭代器方式更高效
- Java 8的forEach方法在并行处理大数据集时可能有优势
注意事项
- 不要在遍历过程中直接修改集合结构(使用集合的add/remove方法),否则会抛出
ConcurrentModificationException - 需要修改集合时,应使用迭代器的remove方法
- 对于并发集合,考虑使用
ConcurrentHashMap或CopyOnWriteArrayList等线程安全集合
通过掌握这些遍历方式,你可以根据具体场景选择最合适的方法来操作集合元素。
