Java 集合遍历
引言
在Java编程中,集合是用来存储和操作一组数据的容器。而集合遍历则是我们日常编程中最常见的操作之一,它允许我们按特定顺序访问集合中的每个元素。掌握各种遍历方式对于有效处理集合数据至关重要。
本文将介绍Java集合框架中的多种遍历方法,从传统的迭代器到现代的Stream API,帮助你选择最适合特定场景的遍历技术。
集合遍历的基本方式
1. 使用迭代器(Iterator)
迭代器是Java集合框架的核心部分,提供了一种统一的方式来遍历集合。
import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class IteratorExample { public static void main(String[] args) { List
输出:
苹果香蕉橙子
提示Iterator接口还提供remove()方法,可以在遍历过程中安全地删除元素。
2. 使用for-each循环
Java 5引入的for-each循环(增强型for循环)提供了一种更简洁的遍历集合的方式:
import java.util.ArrayList;import java.util.List;public class ForEachExample { public static void main(String[] args) { List
输出:
苹果香蕉橙子
3. 使用传统for循环(仅适用于List)
当我们需要索引值时,可以使用传统for循环遍历List集合:
import java.util.ArrayList;import java.util.List;public class ForLoopExample { public static void main(String[] args) { List
输出:
索引 0: 苹果索引 1: 香蕉索引 2: 橙子
现代Java集合遍历方式
1. 使用forEach方法与Lambda表达式(Java 8+)
Java 8引入了函数式接口和Lambda表达式,使集合遍历更加简洁:
import java.util.ArrayList;import java.util.List;public class ForEachMethodExample { public static void main(String[] args) { List
输出:
苹果香蕉橙子使用方法引用:苹果香蕉橙子
2. 使用Stream API(Java 8+)
Stream API提供了强大的数据处理能力,特别适合复杂的集合操作:
import java.util.ArrayList;import java.util.List;public class StreamExample { public static void main(String[] args) { List
输出:
长度大于2的水果:香蕉橙子葡萄
不同集合类型的遍历
1. 遍历List
前面我们已经展示了遍历List的多种方式。这里不再重复。
2. 遍历Set
Set集合不保证元素顺序,且不能通过索引访问:
import java.util.HashSet;import java.util.Set;public class SetTraversalExample { public static void main(String[] args) { Set
输出可能如下(Set不保证顺序):
使用for-each遍历Set:201030使用Iterator遍历Set:201030使用forEach方法遍历Set:201030
3. 遍历Map
Map是键值对集合,有多种遍历方式:
import java.util.HashMap;import java.util.Map;public class MapTraversalExample { public static void main(String[] args) { Map
输出:
遍历键值对:苹果: 5元香蕉: 3元橙子: 4元遍历键:苹果香蕉橙子遍历值:5元3元4元使用forEach和Lambda:苹果: 5元香蕉: 3元橙子: 4元
各种遍历方式的性能比较
不同的遍历方式在性能上有所差异:
警告在一般应用中,各遍历方式的性能差异很小。应根据代码可读性和实际需求选择合适的遍历方式。
实际应用案例
案例1:购物车商品统计
import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;class Product { private String name; private double price; private int quantity; public Product(String name, double price, int quantity) { this.name = name; this.price = price; this.quantity = quantity; } public String getName() { return name; } public double getPrice() { return price; } public int getQuantity() { return quantity; }}public class ShoppingCartExample { public static void main(String[] args) { // 创建购物车 List
输出:
购物车商品列表:--------------------------------商品名称 单价 数量 小计 笔记本电脑 5999.00 1 5999.00 鼠标 99.00 2 198.00 键盘 199.00 1 199.00 显示器 1299.00 1 1299.00 --------------------------------总计: 7695.00元使用Stream API计算总计: 7695.00元
案例2:学生成绩统计分析
import java.util.*;import java.util.stream.Collectors;class Student { private String name; private Map
输出:
学生平均分统计(传统方式):张三 : 84.33李四 : 83.33王五 : 87.33数学成绩最高的学生: 张三, 分数: 90按平均分排序后的学生名单:王五 : 87.33张三 : 84.33李四 : 83.33
遍历过程中修改集合的注意事项
在遍历集合时修改集合内容需要特别小心:
注意使用for-each循环或迭代器遍历集合时,除了通过迭代器的remove()方法外,不应修改集合结构,否则会抛出ConcurrentModificationException。
安全删除元素的方法:
import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class SafeRemovalExample { public static void main(String[] args) { List
输出:
原始列表: [苹果, 香蕉, 橙子, 西瓜]使用Iterator删除元素:删除后: [苹果, 橙子, 西瓜]使用removeIf删除元素:删除后: [苹果, 香蕉, 西瓜]
总结
本文详细介绍了Java集合遍历的多种方式,从传统的迭代器到现代的Stream API。选择合适的遍历方式取决于具体需求:
迭代器(Iterator): 灵活性高,可以在遍历时安全删除元素
For-Each循环: 语法简洁,适合大多数情况
传统For循环: 可以获取索引位置,但仅适用于List
Lambda表达式与forEach方法: 代码更简洁优雅
Stream API: 适合复杂数据处理和链式操作
不同的集合类型(List、Set、Map)有各自特定的遍历方式。在实际开发中,应根据代码可读性、业务需求和性能考虑选择最合适的遍历方法。
练习题
编写程序,使用三种不同方式遍历ArrayList,并比较它们的代码简洁性。
创建一个HashMap存储学生姓名和成绩,然后使用不同方式遍历输出。
使用Stream API筛选出列表中的偶数并计算它们的和。
编写程序,安全地从ArrayList中删除满足特定条件的元素。
参考资源
Java官方文档: Collections Framework Overview
Stream API: java.util.stream
Java Lambda表达式: Lambda Expressions