Com o JDK / 11, uma maneira alternativa de converter um Collection<Foo>em um Foo[]poderia ser usar Collection.toArray(IntFunction<T[]> generator)como:
Foo[] foos = fooCollection.toArray(new Foo[0]); // before JDK 11
Foo[] updatedFoos = fooCollection.toArray(Foo[]::new); // after JDK 11
Conforme explicado por @Stuart na lista de discussão (grifo meu), o desempenho disso deve ser essencialmente o mesmo do existente Collection.toArray(new T[0])-
O resultado é que as implementações que usam Arrays.copyOf() são as mais rápidas, provavelmente por serem intrínsecas .
Ele pode evitar o preenchimento zero da matriz alocada recentemente, porque sabe que todo o conteúdo da matriz será substituído. Isso ocorre independentemente da aparência da API pública.
A implementação da API no JDK diz:
default <T> T[] toArray(IntFunction<T[]> generator) {
return toArray(generator.apply(0));
}
A implementação padrão chama generator.apply(0)para obter uma matriz de tamanho zero e simplesmente chama toArray(T[]). Isso passa pelo Arrays.copyOf()
caminho rápido, portanto é essencialmente a mesma velocidade que toArray(new T[0]).
Nota : - Apenas o uso da API deve ser orientado juntamente com uma incompatibilidade reversa quando usado para código comnullvalores, por exemplo,toArray(null)uma vez que essas chamadas agora seriam ambíguas por causa da existênciatoArray(T[] a)e falhariam na compilação.
Stream.toArrayAPI existente do JDK.