一、背景
在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))
原文地址









