В 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.toArray
API от JDK.