Dengan JDK / 11, cara alternatif untuk mengonversi a Collection<Foo>
menjadi Foo[]
dapat digunakan Collection.toArray(IntFunction<T[]> generator)
sebagai:
Foo[] foos = fooCollection.toArray(new Foo[0]); // before JDK 11
Foo[] updatedFoos = fooCollection.toArray(Foo[]::new); // after JDK 11
Sebagaimana dijelaskan oleh @Stuart pada milis (penekanan milik saya), kinerja ini pada dasarnya harus sama dengan yang ada Collection.toArray(new T[0])
-
Hasilnya adalah implementasi yang menggunakan Arrays.copyOf(
) adalah yang tercepat, mungkin karena itu adalah intrinsik .
Ini dapat menghindari nol-mengisi array yang baru dialokasikan karena tahu seluruh isi array akan ditimpa. Ini benar terlepas dari seperti apa API publik itu.
Implementasi API dalam JDK berbunyi:
default <T> T[] toArray(IntFunction<T[]> generator) {
return toArray(generator.apply(0));
}
Panggilan implementasi standar generator.apply(0)
untuk mendapatkan array nol panjang dan kemudian hanya memanggil toArray(T[])
. Ini melewati Arrays.copyOf()
jalur cepat, jadi pada dasarnya kecepatannya sama dengan toArray(new T[0])
.
Catatan : - Hanya saja penggunaan API akan dipandu bersama dengan ketidakcocokan ke belakang ketika digunakan untuk kode dengannull
nilai-nilai misalnyatoArray(null)
karena panggilan ini sekarang akan ambigu karena adatoArray(T[] a)
dan akan gagal untuk dikompilasi.
Stream.toArray
API yang ada dari JDK.