java中的toArray与stream.toArray有什么性能差异

2023-12-24

我需要将 ids 列表转换为 ids 数组。 我可以通过多种方式做到这一点,但不确定应该使用哪一种。

Say,

1. ids.stream().toArray(Id[]::new)
2. ids.toArray(new Id[ids.length])

哪一种更有效,为什么?


java-11 介绍Collection::toArray有这个实现:

default <T> T[] toArray(IntFunction<T[]> generator) {
    return toArray(generator.apply(0));
}

为了使您的情况更简单,它实际上是在做:ids.toArray(new Id[0]);也就是说 - 它没有指定总的预期大小。

这比指定大小更快,而且不直观;但与以下事实有关:如果 JVM 可以证明您正在分配的数组将被紧随其后的某些复制覆盖,则它不必对数组进行初始清零,这证明是比指定初始大小(必须进行归零)更快。

流方法将具有(或尝试猜测估计)流内部将计算的初始大小,因为:

 ids.stream().toArray(Id[]::new)

实际上是:

 ids.stream().toArray(size -> Id[size]);

然后size是已知的或估计的,基于内部特征Spliterator有。如果流报告SIZED特征(就像你的简单情况一样),那么就很容易,size总是已知的。另一方面,如果这SIZED不存在,流内部只会估计将存在多少元素,在这种情况下,将使用隐藏的新集合来捕获元素,称为SpinedBuffer.

您可以阅读更多内容here https://shipilev.net/blog/2016/arrays-wisdom-ancients/,但是方法ids.toArray(new Id[0])将是最快的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中的toArray与stream.toArray有什么性能差异 的相关文章

随机推荐