You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Stream过滤HashSet后Collectors.toList()与toSet()效率对比疑问

性能对比结论

疑问1解答

Collectors.toList()的效率显著高于Collectors.toSet(),不存在效率更低的情况:

  • toList()默认生成ArrayList,添加元素仅需数组下标赋值,触发扩容时才会有批量拷贝,单次添加均摊时间复杂度O(1),无额外运算开销。
  • toSet()默认生成HashSet,每个元素插入前需要计算hashCode、定位哈希桶,还要处理哈希冲突(链表遍历/红黑树插入),额外计算量远高于ArrayList插入,当存储对象的hashCode计算逻辑复杂时,性能差距会进一步拉大。

疑问2解答

  • 两种收集操作的渐进时间复杂度确实都是O(n)(n为过滤后符合条件的元素数量),和直接new ArrayList<>(originalSet)的O(n)属于同一复杂度等级,但两者的实际耗时常数项差距极大,相同元素数量下toSet()的耗时通常是toList()的2~10倍。
  • Stream往List中添加元素的耗时和直接转List的耗时基本持平;往Set中添加元素的耗时要远高于List插入。

选型建议

你优先选择List的方案完全合理:

  • 内存层面:ArrayList的内存开销仅为同数据量HashSet的1/3~1/5,HashSet需要额外维护哈希桶数组、每个元素的Node包装对象,80万级数据规模下内存差距可达数MB到数十MB。
  • 性能层面:你是从HashSet过滤数据,原数据本身就不存在重复元素,过滤后的结果也不会有重复,完全不需要用Set去重,用List既省内存又更快,没有任何性能损失。
  • 优化建议:如果你使用Java 16及以上版本,可以用stream().filter(Object::isEnabled).toList()替代Collectors.toList(),返回不可变List的性能更高、内存占用更低。

内容的提问来源于stack exchange,提问作者StackOverthrow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 06:15:07