使用Java并行流collect时会创建多少个TreeSet对象?
并行流collect操作中TreeSet对象的创建数量
你的理解不正确,这段代码创建的TreeSet对象数量不是固定的2个,它取决于并行流的任务拆分逻辑和当前JVM的并行度设置。
核心原理
并行流的collect方法依赖三个参数:
- Supplier(供应器):
TreeSet::new,负责创建新的容器实例。在并行执行时,每个独立的子任务线程都会调用一次Supplier来生成自己的容器。 - Accumulator(累加器):
Set::add,负责将元素添加到当前线程的容器中。 - Combiner(组合器):
Set::addAll,负责将多个线程的容器内容合并到最终结果容器中。
具体到你的代码
你示例中的流有4个元素,在并行执行时:
- 如果JVM默认的并行度(通常等于CPU核心数)是4,流会拆分为4个独立子任务,每个子任务对应一个元素,此时会创建4个
TreeSet实例,最后通过组合器合并为1个最终的Set。 - 如果并行度是2,流会拆分为2个子任务,此时会创建2个
TreeSet实例,合并后得到最终结果。 - 极端情况下(比如并行度被设置为1,等同于串行流),只会创建1个
TreeSet实例。
所以你认为固定创建2个的理解是不准确的,实际数量由并行任务的拆分数量决定。
内容的提问来源于stack exchange,提问作者sjk
相关产品推荐
相关产品推荐

