将ArraySeq上的IndexedSeqView操作后转回ArraySeq的最高效方法是什么
结论
最高效的实现方式是 ArraySeq.unsafeWrapArray(view.toArray),完全满足仅一次数组分配、一次数组拷贝的需求。
原理说明
- 针对底层基于
ArraySeq的IndexedSeqView,Scala标准库的toArray方法已经做了针对性优化:可以识别出视图的数组底层实现,直接调用System.arraycopy走快速拷贝路径,仅分配一次目标数组、完成一次批量拷贝即可得到结果数组,不需要逐元素遍历处理。对于基本类型的视图,还可以避免装箱拆箱的额外开销,性能远高于逐元素处理的方案。 ArraySeq.unsafeWrapArray不会对传入的数组做二次拷贝,直接将传入数组作为新ArraySeq的底层存储,只要你后续不会手动修改view.toArray返回的数组,这个操作是完全安全的,且没有额外性能成本。
和ArraySeq.from(view)的对比
ArraySeq.from(view)的时间复杂度确实是O(n),但它的底层实现是通过Builder逐元素追加生成ArraySeq,除了元素遍历的开销外,还要承担Builder的扩容、中间状态维护成本,大集合场景下性能和快速拷贝的方案差距非常明显。
内容的提问来源于stack exchange,提问作者kag0
相关产品推荐
相关产品推荐

