Java中Stream(java.util.stream)与LinkedList的关联及流管道实现疑问
Java Stream管道的“链表实现”到底是怎么回事?
别找LinkedList了,是自定义的单向链表
Brian Goetz说的“链表表示”,根本不是Java集合里的LinkedList类,而是Stream内部自己实现的单向链表结构——核心是AbstractPipeline这个类。
你写的每一个中间操作,比如filter、map,都会生成一个AbstractPipeline实例,每个实例都会存着上一个操作的AbstractPipeline引用,串起来就是一条链。比如stream.filter(...).map(...),map的节点指向filter的节点,filter的节点指向源Stream的节点,完全是Stream自己搞的链表,和集合框架的LinkedList八竿子打不着,所以你搜源码肯定找不到。
为啥选链表不选ArrayList?
核心是贴合Stream的特性:
- 中间操作是动态追加的:你可以随时在Stream链后面加新的中间操作,链表加节点是O(1)的成本,
ArrayList要是满了还要扩容拷贝,开销大得多。 - 只需要单向遍历:Stream执行时,数据是从上游流到下游,操作链只需要从尾到头(构建执行管道)或者从头到尾(处理数据)单向走,
ArrayList的随机访问优势在这里没用,反而链表的结构更轻量。 - 不浪费内存:每个
AbstractPipeline节点只存上游引用和自己的操作逻辑,不像ArrayList要预分配一堆空位置,内存利用率更高。
顺带说下Stream的执行流程
当你调用终端操作(比如collect、forEach)时,Stream会从操作链的最后一个节点开始,往上遍历整个链表,把所有操作串成一个执行流程,然后把源数据挨个送过每个操作节点,最后输出结果。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

