一、背景
在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))