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 जैसा दिखता है, यह परवाह किए बिना सच है।
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
JDK से मौजूदा एपीआई से मेल खाता है ।