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 dengannullnilai-nilai misalnyatoArray(null)karena panggilan ini sekarang akan ambigu karena adatoArray(T[] a)dan akan gagal untuk dikompilasi.
Stream.toArrayAPI yang ada dari JDK.