Java遍历集合的"十八般武艺"大比拼 🥋
各位Java剑客们好!今天我们要来一场集合遍历的武林大会,看看增强for循环、普通for循环、迭代器、foreach这些"兵器"各有什么绝招!
1. 普通for循环 - 老派但可靠的老爷爷 👴
java
for(int i=0; i<list.size(); i++){
System.out.println(list.get(i));
}
特点:
- 像个固执的老爷爷,非要自己数着来
- 需要知道集合大小(size)
- 可以通过索引随机访问元素
- 在ArrayList等随机访问集合中效率高
- 但在LinkedList中就是自虐行为(每次get(i)都要从头遍历)
**底层原理:**就是老老实实的从0数到size-1,每次用get方法获取元素。
2. 迭代器(Iterator) - 专业的集合导游 🚩
java
Iterator<String> it = list.iterator();
while(it.hasNext()){
String item = it.next();
System.out.println(item);
}
特点:
- 像个专业的导游,知道集合里每个元素的位置
- 统一了各种集合的遍历方式
- 可以在遍历时安全地删除元素(it.remove())
- 有些集合(如ConcurrentHashMap)有特殊的fail-fast机制
底层原理: 集合内部实现Iterator接口,维护一个游标记录当前位置。hasNext()检查是否还有元素,next()移动游标并返回元素。
3. 增强for循环(foreach) - 语法糖小甜甜 🍬
java
for(String item : list){
System.out.println(item);
}
特点:
- 表面甜美简单,底层还是调用迭代器
- 编译后会转换成Iterator遍历方式
- 代码简洁,但无法获取索引
- 遍历时不能修改集合(会抛ConcurrentModificationException)
底层原理: 编译器会把这段代码转换成使用Iterator的等效代码,所以本质上和迭代器遍历是一样的。
4. forEach()方法 - 时髦的函数式小子 🕶️
java
list.forEach(item -> System.out.println(item));
特点:
- Java 8引入的时髦方法
- 接受一个Consumer函数式接口
- 可以配合方法引用使用(list.forEach(System.out::println))
- 并行流中表现优秀
**底层原理:**内部也是使用迭代器,但是以函数式的方式呈现。
5. 流式操作(Stream) - 高端大气上档次 🚀
java
list.stream().forEach(System.out::println);
特点:
- 不是单纯的遍历,而是一整套数据处理流水线
- 可以轻松实现过滤、映射、归约等操作
- 支持并行处理
- 延迟执行,只有遇到终端操作才会真正执行
底层原理: 比较复杂,涉及Spliterator分割数据源,管道操作等。
性能大比拼 🏎️
遍历方式 | ArrayList | LinkedList | HashSet |
---|---|---|---|
普通for循环 | ⚡⚡⚡⚡⚡ | 🐢🐢🐢🐢🐢 | 不支持 |
迭代器 | ⚡⚡⚡⚡ | ⚡⚡⚡⚡ | ⚡⚡⚡⚡ |
增强for循环 | ⚡⚡⚡⚡ | ⚡⚡⚡⚡ | ⚡⚡⚡⚡ |
forEach() | ⚡⚡⚡ | ⚡⚡⚡ | ⚡⚡⚡ |
Stream | ⚡⚡ | ⚡⚡ | ⚡⚡ |
使用场景指南 📋
- 需要索引 ➡️ 普通for循环
- 遍历时可能删除元素 ➡️ 迭代器
- 代码简洁优先 ➡️ 增强for循环
- 函数式编程风格 ➡️ forEach()或Stream
- 大数据量并行处理 ➡️ Stream.parallel()
趣味冷知识 ❄️
- 增强for循环在Java中被称为"for-each循环",但官方文档其实叫"enhanced for statement"
- 迭代器的remove()方法是唯一安全地在遍历时删除元素的方式
- Java 5之前,程序员只能用普通for循环或迭代器,生活多么"美好"啊!
- 使用Stream时,如果不加.parallel(),它就是个"有钱但低调的富豪" - 有能力但不炫耀
总结 🎯
选择哪种遍历方式,就像选择用什么交通工具:
- 普通for循环 - 骑自行车,完全掌控但费力
- 迭代器 - 坐公交,固定路线但可靠
- 增强for循环 - 打车,省心但花钱
- forEach() - 坐地铁,现代高效
- Stream - 坐飞机,长途旅行最佳选择
记住:没有最好的,只有最合适的!根据场景选择你的"武器"吧!