З JDK / 11, альтернативним способом перетворення Collection<Foo>
в Foo[]
може використовувати Collection.toArray(IntFunction<T[]> generator)
як:
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.