使用しての間に違いがありStream.builder()
作成対ArrayList
して、呼び出しstream()
それには?
これは、実装の詳細が、はい、ビルダーは良好含まれる要素の上のストリーミング操作が続く、増分充填されたユースケースに最適化されます。
これとは対照的に、ArrayList
任意の修正及びランダムアクセスをサポートする必要があります。
繰り返しに要素を追加するときに、ArrayList
正しく予測された初期容量を指定しなくても、それは新しい、より大きな配列を割り当てて、電流容量が消耗している時はいつでもそこに現在の配列をコピーする必要があるかもしれません。
これとは対照的に、ビルダーは、すべての配列を必要としない単一要素の場合、のための特別なサポートがあります。より多くの要素が追加された場合はその後、それがに変わります背骨バッファ。このバッファのような小さなアレイで始まるArrayList
が、その容量がなくなった場合には、その代わりに繰り返し大きなフラットアレイに配列をコピーする配列の配列を使用し始めます。
だから、これは充填時に、あなたが持っていると思いますコピーのコストを節約できますArrayList
。あなたはのためにこれらのコストを節約することができますArrayList
右の初期容量を指定することではなく、推定値が利用可能である場合にのみが動作します。初期容量を指定すると、空の場合の最適化を削除します。だから、一般的に、ストリームビルダは、はるかに優れた、未知の大きさに対処することができます。
この設計の別の特性は、それがあるStream.Builder
とは異なり、より2³¹要素に対処することができArrayList
ますが、十分なメモリを持っている場合は、。