繁体   English   中英

Java 中 ArrayList 上的 Stream.builder() 和调用 stream() 有什么区别?

[英]What's the difference between Stream.builder() and calling stream() on an ArrayList in Java?

使用Stream.builder()与创建ArrayList然后在其上调用stream()之间有什么区别吗?

这是一个实现细节,但是是的,构建器针对增量填充的用例进行了更好的优化,然后是对包含的元素进行流式传输的操作。

相比之下, ArrayList必须支持任意修改和随机访问。

因此,当在未指定正确预测的初始容量的情况下向ArrayList重复添加元素时,它可能需要分配一个新的更大的数组,并在当前容量耗尽时将当前数组复制到其中。

相比之下,构建器对单元素情况有特殊的支持,它根本不需要数组。 然后,如果添加更多元素,它将变成一个旋转缓冲区 这个缓冲区从一个像ArrayList这样的小数组开始,但是当它的容量耗尽时,它开始使用数组的数组,而不是重复地将数组复制到更大的平面数组。

因此,这可以节省填充ArrayList时的复制成本。 您可以通过指定正确的初始容量来为ArrayList节省这些成本,但这仅在估算可用时才有效。 指定初始容量也会消除对空情况的优化。 所以一般来说,流构建器可以更好地处理未知大小。

这种设计的另一个特性是Stream.Builder可以处理超过 2³¹ 个元素,这与ArrayList不同,如果您有足够的内存。

Stream.builder()不是终端操作,所以它是懒惰的。 理论上,使用第二个会占用更多内存。 Stream.Builder Javadoc这允许通过单独生成元素并将它们添加到Builder来创建Stream (没有使用ArrayList作为临时缓冲区的复制开销。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM