gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:00:08 28 4
gpt4 key购买 nike

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

说,

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 ,但方法 ids.toArray(new Id[0]) 将是最快的。

关于java - Java 中的 toArray 与 stream.toArray 有什么性能差异吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55413759/

28 4 0