使用Stream.builder()与创建一个ArrayList然后调用stream()它之间有什么区别吗?
这是一个实现细节,但是是的,构建器针对增量填充的用例进行了更好的优化,然后是对包含的元素进行流式传输的操作。
相比之下,anArrayList必须支持任意修改和随机访问。
因此,当在ArrayList没有指定正确预测的初始容量的情况下重复添加元素时,它可能需要分配一个新的更大的数组,并在当前容量耗尽时将当前数组复制到其中。
相比之下,构建器对单元素情况有特殊的支持,它根本不需要数组。然后,如果添加更多元素,它将变成一个旋转缓冲区。这个缓冲区从一个小数组开始,ArrayList但是当它的容量耗尽时,它开始使用一个数组数组,而不是重复将数组复制到一个更大的平面数组。
因此,这可以节省您在填写ArrayList. 您可以ArrayList通过指定正确的初始容量来节省这些成本,但这仅在估算可用时才有效。指定初始容量也会消除对空情况的优化。所以一般来说,流构建器可以更好地处理未知大小。
这种设计的另一个特性是Stream.Builder可以处理超过 2³¹ 个元素,这与 不同ArrayList,如果您有足够的内存。