我需要将 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(使用前将#替换为@)