一、背景
在JDK8
之后,我们经常会使用stream
进行数据流式处理,使得Java
具备了分组统计、流式处理的能力,但是在一些使用方面的细节需要注意,否则在大数据量流水处理时,会影响到性能,引发OOM
二、Collectors的优化
collectors
提供了基础的集合收集能力,常见的有:
-
toList
-
toSet
-
toMap
-
toConcurrentMap
-
toCollection
查看1~4的源码,发现初始化的集合类为
-
toList
->ArrayList::new
-
toSet
->HashSet::new
-
toMap
->HashMap::new
-
toConcurrentMap
->ConcurrentHashMap::new
我们都知道,ArrayList
、HashSet
、HashMap
、ConcurrentHashMap
在新建时会初始化空间,当空间不足时会扩容,在大数据量不断新增,那么会发生多次扩容,通常在stream
流式处理时都是知道原input
的大小,那么我们就可以根据这个大小预估初始化的集合空间,避免扩容占用占用内存和触发垃圾回收
三、解决方法
上面还有第5方法,toCollection
,我们可以
Collectors.toCollection(() -> Lists.newArrayListWithCapacity(100))
原文地址