文章目录
前言
Java 作为一门广泛应用的编程语言,在开发中对集合(Collection)的操作尤为频繁。遍历集合是日常编码中最常见的操作之一,而不同的集合类型和使用场景决定了应选择合适的遍历方式。本文将系统地介绍 Java 中常见的集合遍历方式,分析其适用场景、优缺点,并提供代码示例,帮助开发者更高效、安全地处理集合数据。
一、遍历方式适用的集合
1. 使用增强的 for 循环(适用List 和 Set)
import java.util.*;
public class TraverseExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
// 遍历 List
for (String fruit : list) {
System.out.println(fruit);
}
Set<Integer> set = new HashSet<>(Arrays.asList(1, 2, 3));
// 遍历 Set
for (Integer num : set) {
System.out.println(num);
}
}
}
2. 使用 Iterator(适用List 和 Set)
Iterator 是 Java 提供的通用集合迭代器,可以用于遍历所有集合类型(如 List、Set、Queue 等)。特别适用于需要删除元素的场景,因为它支持通过 remove() 方法删除元素。
import java.util.*;
public class IteratorExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry"));
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String fruit = iterator.next();
System.out.println(fruit);
// 可以安全地删除当前元素
if ("Banana".equals(fruit)) {
iterator.remove(); // 安全删除
}
}
// 使用 for-each 循环结合 removeIf (Java 8+) 通常是更好的删除方式
// list.removeIf(fruit -> "Banana".equals(fruit));
}
}
3. 使用 for 循环(适用List )
虽然 for-each 循环更加简洁,但在某些情况下,你可能希望通过传统的 for 循环来遍历集合,特别是在你需要访问集合的索引时。
import java.util.*;
public class ForLoopExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
for (int i = 0; i < list.size(); i++) {
String fruit = list.get(i);
System.out.println("Index " + i + ": " + fruit);
}
}
}
4. 使用 forEach 方法(Java 8 引入,适用List、Set 和 Map)
//对于list
List<String> list = Arrays.asList("apple", "banana", "cherry");
list.forEach(fruit -> System.out.println(fruit));
//也可以使用更简洁的方法引用
list.forEach(System.out::println);
//Map 的 forEach 方法
Map<String, Card> cardMap = new HashMap<>();
cardMap.put("card1", new Card("1001"));
cardMap.put("card2", new Card("1002"));
cardMap.forEach((key, value) -> {
System.out.println("Key: " + key + ", Value: " + value.getID());
});
5.使用 Stream API (Java 8+)
import java.util.*;
import java.util.stream.*;
public class StreamExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
// forEach 方法
list.stream().forEach(System.out::println);
// 可以结合过滤、映射等操作
list.stream()
.filter(fruit -> fruit.startsWith("A"))
.map(String::toUpperCase)
.forEach(System.out::println);
}
}
二、集合适用的遍历方式
集合类型 | 推荐遍历方式 |
---|---|
List | - 增强 for 循环(通用) - 传统 for 循环(需索引) - Iterator(需删除) - forEach()(简洁风格) |
Set | - 增强 for 循环 - Iterator(需删除) - forEach() |
Map | - forEach(BiConsumer)(推荐) - entrySet() + 增强 for 循环 - keySet() 或 values() 遍历键或值 |
1.Map 的其他遍历方式
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
// 方式一:entrySet 遍历键值对
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
// 方式二:keySet 遍历所有键
for (String key : map.keySet()) {
System.out.println("Key: " + key);
}
// 方式三:values 遍历所有值
for (Integer value : map.values()) {
System.out.println("Value: " + value);
}
2.特殊场景建议
需要删除元素:优先使用 Iterator.remove() 或 Collection.removeIf()(Java 8+)。
list.removeIf(fruit -> "Banana".equals(fruit));
- 高性能要求(如 ArrayList):传统 for 循环(索引)效率高。
- 并发修改风险:避免在增强 for 循环中直接调用 list.remove()。
- 函数式编程风格:推荐使用 stream().forEach() 或直接 forEach()。
总结
本文系统梳理了 Java 中常见的集合遍历方式及其适用场景:
增强 for 循环:语法简洁,适用于大多数只读遍历场景,推荐用于 List 和 Set。
Iterator:唯一支持安全删除的遍历方式,是需要在遍历中删除元素时的首选。
传统 for 循环:适用于 List 且需要索引的场景,但不推荐用于 LinkedList。
forEach (Lambda):Java 8+ 推荐方式,代码简洁,支持函数式编程,适用于 List、Set、Map。
Map 遍历:推荐使用 forEach(BiConsumer) 或 entrySet() 增强 for 循环。