2012-03-26 9 views
10

मुझे आश्चर्य है कि उन्होंने toArray विधि को ArrayList में जावा में एक सरणी इनपुट करने के लिए क्यों डिजाइन किया?जावा में ArrayList.toArray() विधि

ArrayList<String> listArray = new ArrayList<String>(); 

    listArray.add("Germany"); 
    listArray.add("Holland"); 
    listArray.add("Sweden"); 

    String []strArray = new String[3]; 
    String[] a = (String [])listArray.toArray(strArray); 
मेरे लिए

ऐसा लगता है कि, वे न इस इनपुट की जरूरत है क्योंकि ArrayList के ही उदाहरण पर्याप्त विवरण एक सरणी में डेटा परिवर्तित करने के लिए है।

मेरा सवाल यह है कि उन्हें अभी भी सरणी में प्रवेश करने की आवश्यकता क्यों है? धन्यवाद।

उत्तर

13

दो कारण मैं के बारे में सोच सकते हैं:

  1. मिटाना मतलब यह है कि सामान्य मापदंडों रनटाइम पर उपलब्ध नहीं हैं, इसलिए एक ArrayList<String> पता नहीं है कि यह तार शामिल हैं, यह सिर्फ कच्चे प्रकार ArrayList है। इस प्रकार toArray() के सभी आमंत्रणों को Object[] वापस करना होगा, जो कड़ाई से सही नहीं है। आपको वास्तव में String[] की दूसरी सरणी बनाना होगा, फिर वांछित परिणाम प्रकार के साथ आने के लिए इसके सभी पैरामीटर को कास्ट करने के पहले पहले फिर से शुरू करें।
  2. विधि परिभाषित करने का तरीका है कि आप किसी मौजूदा सरणी के संदर्भ में पास कर सकते हैं, और यह विधि के माध्यम से पॉप्युलेट किया गया है। कुछ मामलों में यह एक नया सरणी लौटाए जाने के बजाय और इसके मूल्यों को कहीं और कॉपी करने की बजाय बहुत सुविधाजनक है।
+0

धन्यवाद, मैं समझ गया। मेरे उदाहरण में, क्या मुझे अंतिम परिणाम के रूप में "strArray" या "a" मानना ​​चाहिए? क्या वे वही हैं? –

+4

वे वही हैं, _if_ 'collection.size() <= strArray.size()', जो आपके विशिष्ट मामले में सत्य है। वैसे भी 'ए' का उपयोग करने के लिए यह आमतौर पर सबसे अच्छा अभ्यास है। –

+0

@ लुइस वासरमैन धन्यवाद। –

0

ऐसा इसलिए है कि जब आपके पास एक गैर-खाली सरणी हो, तो आप सरणी सूची रूपांतरण से ऑब्जेक्ट को जोड़ना चाहते हैं, आप इसे एक नई सरणी बनाने के बिना कर सकते हैं, और इसे विलय करने की पोस्ट प्रोसेसिंग कर सकते हैं, संसाधन को बचा सकते हैं और अतिरिक्त काम।

पढ़ें जावाडोक के दूसरे पैरा: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html#toArray (टी [])

1

आपको Object[] के अलावा सरणी प्रकार प्राप्त करने की आवश्यकता है। listArray.toArray(new String[3]) को वास्तव में String[] पर कास्ट की आवश्यकता नहीं है, लेकिन यह आपको Object[] कास्टिंग करने के बजाय केवल आपके प्रकार के किसी भी प्रकार के (बजाय असुरक्षित) दृष्टिकोण के बजाय विशिष्ट प्रकारों के लिए सरणी में लिखने देता है।

0

यह नहीं अनिवार्य toArray() के लिए एक तर्क के रूप सरणी पारित करने के लिए, आप सीधे कॉल कर सकते हैं arrayList.toArray()

कि हम जानते हैं कि जेनरिक के साथ संग्रह ढांचे प्रकार मिटाना की अवधारणा के साथ काम करता है। तो सरणी सूची ऑब्जेक्ट की सूची बन जाती है, इसलिए जब आप सरणी में कनवर्ट करते हैं तो यह ऑब्जेक्ट [] देगा यदि आप कोई तर्क नहीं देते हैं।

0

ArrayList में पर्याप्त जानकारी नहीं है क्योंकि "डेटा" Object सरणी की बाल्टी में संग्रहीत है। इसलिए, यदि आप अपनी सरणी सूची में "क्या" आइटम जानते हैं, तो आप toArray विधि के इस संस्करण का उपयोग कर प्रकार सुरक्षा प्राप्त कर सकते हैं।

-1

क्योंकि जिस सरणी में तत्वों की प्रतिलिपि बनाई जानी चाहिए उसे JVM को निर्दिष्ट किया जाना चाहिए।

See this documentation

2

अपने कोड में, ArrayList कुछ भी हो सकते हैं, केवल तार नहीं। आप कोड को फिर से लिखने सकता है:

ArrayList<String> listArray = new ArrayList<String>(); 

listArray.add("Germany"); 
listArray.add("Holland"); 
listArray.add("Sweden"); 

String []strArray = new String[3]; 
String[] a = listArray.toArray(strArray); 

हालांकि, में जावा सरणियों रनटाइम पर अपनी सामग्री प्रकार (स्ट्रिंग), जबकि जेनरिक संकलक द्वारा मिटा दिया जाता है, ताकि वहाँ अभी भी के लिए रन टाइम प्रणाली को पता है कि कोई रास्ता नहीं है इसे आपके कोड में String[] बनाना चाहिए।

संबंधित मुद्दे