JDK / 11, bir dönüştürme alternatif yol ile Collection<Foo>
bir etmek Foo[]
yararlanmak olabilir Collection.toArray(IntFunction<T[]> generator)
gibidir:
Foo[] foos = fooCollection.toArray(new Foo[0]); // before JDK 11
Foo[] updatedFoos = fooCollection.toArray(Foo[]::new); // after JDK 11
Posta listesinde @Stuart tarafından açıklandığı gibi (benim vurgu), bunun performansı esasen mevcut olanla aynı olmalıdır.Collection.toArray(new T[0])
-
Sonuç olarak,) kullanan uygulamalar en hızlıdır, Arrays.copyOf(
çünkü muhtemelen bir içseldir .
Yeni tahsis edilen dizinin sıfır doldurulmasını önleyebilir çünkü tüm dizi içeriğinin üzerine yazılacağını bilir. Bu, genel API'nin nasıl göründüğüne bakılmaksızın geçerlidir.
API'nin JDK içindeki uygulaması şu şekildedir:
default <T> T[] toArray(IntFunction<T[]> generator) {
return toArray(generator.apply(0));
}
Varsayılan uygulama generator.apply(0)
, sıfır uzunluklu bir dizi almayı çağırır ve ardından basitçe çağırır toArray(T[])
. Bu Arrays.copyOf()
hızlı yoldan geçer , bu yüzden aslında aynı hızdır toArray(new T[0])
.
Not : - API kullanımı,değerlerlekod için kullanıldığında geriye dönük bir uyumsuzluk ile birlikte yönlendirilmelidir,null
örneğin,toArray(null)
bu çağrılar artık mevcut olduğundan dolayı belirsiztoArray(T[] a)
olacak ve derlenemeyeceğinden.
Stream.toArray
, JDK'daki mevcut API ile eşleşir .