集合与流有何不同?
集合(Collection)和流(Stream)是 Java 中处理数据的两种核心方式,核心差异在于 “数据存储、处理方式、迭代特性”,具体对比如下:
| 对比维度 | 集合(Collection) | 流(Stream) |
|---|---|---|
| 核心定位 | 数据的存储容器(如 List 存储有序数据、Set 存储唯一数据) | 数据的处理管道(无存储能力,仅处理集合 / 数组等数据源) |
| 处理方式 | 外部迭代(需手动遍历,如for循环、iterator) | 内部迭代(Stream 自动遍历,无需手动控制) |
| 数据状态 | 可修改(如list.add()、map.put()) | 不可修改(仅读取数据源,不改变原始数据) |
| 操作特性 | 中间操作与终端操作无区分,单次遍历仅执行单一操作 | 分为中间操作(如filter、map,惰性执行)和终端操作(如forEach、collect,触发执行) |
| 迭代次数 | 可多次遍历(如多次for循环遍历同一 List) | 仅可遍历一次(遍历后 Stream 关闭,需重新创建) |
| 适用场景 | 需频繁访问、修改数据(如新增 / 删除元素) | 需对数据进行多步处理(过滤、排序、聚合) |
# 示例对比
集合处理(外部迭代,多步操作需多次遍历):
List<Integer> list = Arrays.asList(1,2,3,4,5); // 步骤1:过滤偶数(第一次遍历) List<Integer> evenList = new ArrayList<>(); for (int num : list) { if (num % 2 == 0) evenList.add(num); } // 步骤2:平方(第二次遍历) List<Integer> squareList = new ArrayList<>(); for (int num : evenList) { squareList.add(num * num); }1
2
3
4
5
6
7
8
9
10
11流处理(内部迭代,多步操作单次遍历):
List<Integer> list = Arrays.asList(1,2,3,4,5); List<Integer> squareList = list.stream() .filter(num -> num % 2 == 0) // 中间操作(惰性) .map(num -> num * num) // 中间操作(惰性) .collect(Collectors.toList()); // 终端操作(触发执行)1
2
3
4
5
上次更新: 12/30/2025