В JDK / 11 альтернативный способ преобразования a Collection<Foo>в an Foo[]может заключаться в использовании Collection.toArray(IntFunction<T[]> generator)as:
Foo[] foos = fooCollection.toArray(new Foo[0]); // before JDK 11
Foo[] updatedFoos = fooCollection.toArray(Foo[]::new); // after JDK 11
Как объяснил @Stuart в списке рассылки (выделено мной), производительность этого должна быть по существу такой же, как у существующей Collection.toArray(new T[0])-
Результатом является то, что реализации, использующие Arrays.copyOf(), являются самыми быстрыми, вероятно, потому, что это внутренняя .
Он может избежать заполнения нулями только что выделенного массива, поскольку знает, что все содержимое массива будет перезаписано. Это верно независимо от того, как выглядит общедоступный API.
Реализация API в JDK гласит:
default <T> T[] toArray(IntFunction<T[]> generator) {
return toArray(generator.apply(0));
}
Реализация по умолчанию вызывает generator.apply(0)массив нулевой длины, а затем просто вызывает toArray(T[]). Это проходит по Arrays.copyOf()
быстрому пути, поэтому по сути это та же скорость, что и toArray(new T[0]).
Примечание : - Просто следует руководствоваться использованием API вместе с обратной несовместимостью при использовании для кода соnullзначениями, например,toArray(null)поскольку эти вызовы теперь будут неоднозначными из-за наличияtoArray(T[] a)и не смогут компилироваться.
Stream.toArrayAPI от JDK.