[英]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.