On Fri, 7 Apr 2023 08:27:18 GMT, Tingjun Yuan <d...@openjdk.org> wrote:
> In the current implementation of `String.join(CharSequence, Iterable)`, the > temp array `elems` is always initialized with a length of 8. It will cause > many array recreations when the `Iterable` contains more than 8 elements. > Furthermore, it's very common that an `Iterable` is also a `Collection`. So > if the `Iterable` is an instance of `Collection`, the initial length of the > array can be `((Collection<?>)elements).size()`. It will not change the > current behavior even if the `Collection` is modified asynchronously. > > I don't know whether this change requires a CSR request. What about using Iterable::spliterator instead of Iterable::iterator (enhanced for loop)? Spliterator would allow you to call Spliterator::estimateSize and then to default to 8 if less than 8, cast and use if less than or equal to ArraysSupport.SOFT_MAX_ARRAY_LENGTH, or throw OutOfMemoryError if greater than Integer.MAX_VALUE. The array growth code would have to use ArraysSupport.newLength to deal with huge sizes. I'm not sure if bootstrapping issues will prevent you from using lambdas expressions to traverse the Spliterator. If lambdas expressions are forbidden then this approach will introduce some code smell by having to use inner classes. ------------- PR Comment: https://git.openjdk.org/jdk/pull/13383#issuecomment-1501020813