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 comnull
valores, 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.toArray
API existente do JDK.