З 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.toArrayAPI від JDK.