2011-01-25 10 views
16

लोग कहते हैं कि asList विधि सरणी को सूची में परिवर्तित करती है और इसकी प्रतिलिपि नहीं है, इसलिए 'एलीस्ट' में प्रत्येक परिवर्तन 'ए' में प्रतिबिंबित होगा। तो 'एलीस्ट' में नए मान जोड़ें अवैध है, क्योंकि सरणी का आकार निश्चित है।Arrays.asList() संदेह?

लेकिन, asList() विधि ArrayList<T> देता है। कैसे संकलक 5 से लाइन 3 को अलग करता है। लाइन 3 मुझे अपवाद देता है (UnsupportedOperationException)।

 String[] a = {"a","b","c","d"};//1 
     List<String> aList = Arrays.asList(a);//2 
     aList.add("e");//3 
     List<String> b = new ArrayList<String>();//4 
     b.add("a");//5 
+5

इससे कोई फर्क नहीं पड़ता कि 'लोग क्या कहते हैं'। यह जवाडोक * क्या मायने रखता है। – EJP

उत्तर

3

यह एक अपवाद है और संकलक त्रुटि नहीं है। कार्यक्रम चलाया जाता है और संकलन समय पर नहीं खेला जाता है। मूल रूप से वास्तविक वर्ग जो Arrays.asList वापस लौटाएगा विधि के अंदर throw UnsupporteOperationException है।

अधिक विशिष्ट Arrays.asList एक आंतरिक वर्ग Arrays वर्ग AbstractList से ली गई है और add विधि लागू नहीं है कि अंदर परिभाषित वापस आ जाएगी होने के लिए। AbstractList से विधि वास्तव में अपवाद फेंक रही है।

33

Arrays.asList से प्राप्त यह सूची कार्यान्वयन सरणी पर एक विशेष दृश्य है - आप इसका आकार बदल नहीं सकते हैं।

Arrays.asList() का रिटर्न प्रकार java.util.Arrays.ArrayList है जो अक्सर java.util.ArrayList के साथ भ्रमित होता है। Arrays.ArrayList बस सूची के रूप में सरणी दिखाता है।

+3

+1 मुझे लगता है कि यह मूल रूप से प्रश्न का क्रूक्स है। ओपी देखता है कि वापसी का प्रकार ArrayList है, और यह सोच रहा है कि यह एक ArrayList से अलग क्यों व्यवहार करता है। पूरी तरह से वैध सवाल। –

+0

एंड्रियास_D, 'Arrays.asList (...)' का वापसी प्रकार 'java.util.List' है और 'java.util.Arrays.ArrayList' नहीं है। –

3

आप मानते हैं कि Arrays.asList()ArrayList देता है, लेकिन ऐसा नहीं है। Arrays.asList() एक अनिर्दिष्ट List कार्यान्वयन देता है। यह कार्यान्वयन बस प्रत्येक असमर्थित विधि पर UnsupportedOperationException फेंकता है।

4

asList()java.util.ArrayList वापस नहीं करता है, यह java.util.Arrays$ArrayList देता है। यह कक्षा java.util.ArrayList भी विस्तारित नहीं करती है, इसलिए इसका व्यवहार पूरी तरह से अलग हो सकता है (और है)।

add() विधि java.util.AbstractList से विरासत में मिली है, जो डिफ़ॉल्ट रूप से UnsupportedOperationException फेंकता है।

+0

नहीं, जैसा कि सूची एक सूची देता है। जो आप वर्णन कर रहे हैं वह एक विशिष्ट जावा कार्यान्वयन के लिए सच हो सकता है, लेकिन ऐसा कुछ भी नहीं है जिस पर आप भरोसा कर सकते हैं। – jarnbjo

+0

@jarnbjo - यह सूर्य जावा और जीएनयू क्लासपाथ और शायद किसी भी अन्य कार्यान्वयन के लिए सच है क्योंकि यह करने का सबसे आसान तरीका है। जैसा कि सवाल यह था कि संकलक कैसे बता सकता है, हालांकि मैं समझने के लिए एक ठोस उदाहरण सबसे आसान होगा। – OrangeDog

0

asist एक निश्चित आकार की सूची देता है, ताकि आप इसमें नए तत्व नहीं जोड़ सकें। चूंकि यह लौटाई गई सूची वास्तव में उस सरणी का "दृश्य" है जिसे बनाया गया था ('आपके' मामले में 'ए'), यह समझ में आता है कि आप तत्वों को जोड़ने में सक्षम नहीं होंगे - जैसे आप तत्वों को जोड़ नहीं सकते एक सरणी। के लिए asList

9

Read again डॉक्स देखें, Arrays.asList के प्रकार है:

public static <T> List<T> asList(T... a) 

जो स्पष्ट रूप से कहा गया है कि asList एक वस्तु को लागू करने वाली इंटरफ़ेस java.util.List देता है, कहीं नहीं इसे कहते है कक्षा java.util.ArrayList का एक उदाहरण लौटाएगा।

अगला, ध्यान दें कि List.add पर दस्तावेजीकरण का कहना है:

बूलियन ऐड (ई ई)

          इस सूची (वैकल्पिक आपरेशन) के अंत करने के लिए निर्दिष्ट तत्व जोड़ता

तकनीकी तौर पर, हर बार एक चर सूची (ArrayList के बजाय) के रूप में आपके द्वारा लिखा गया उपयोग करते हैं, तो आप हमेशा कि इस विधि UnsupportedOperationException फेंक सकता है उम्मीद करने सावधान रहना चाहिए। यदि आप सुनिश्चित हैं कि आपको केवल एक सूची कार्यान्वयन प्राप्त होगा जो हमेशा .add() का सही अर्थपूर्ण होगा, तो आप अपनी धारणा को अमान्य होने पर बग के जोखिम पर चेक को छोड़ सकते हैं।

1

इस के लिए महत्वपूर्ण List कार्यान्वयन द्वारा

List<String> aList = Arrays.asList(a); 

लौटे आप Arrays में स्रोत कोड को देखो आप देखेंगे कि यह एक आंतरिक निजी स्थिर वर्ग ArrayList शामिल देखेंगे है। यह java.util.ArrayList जैसा नहीं है।

5

मनोज,

Arrays.List की वापसी प्रकार सूची इंटरफ़ेस के कुछ अज्ञात आंतरिक कार्यान्वयन और नहीं java.util.ArrayList है, इसलिए आप केवल एक सूची प्रकार को असाइन कर सकें।

आप उदाहरण के लिए एक ArrayList के लिए असाइन करें यदि यह आप संकलन समय त्रुटि "प्रकार बेमेल: सूची से परिवर्तित नहीं कर सकते ArrayList करने के लिए" दे देंगे

ArrayList<String> aList = Arrays.asList(a);// gives Compile time error 

Javadoc से "Arrays.asList एक फिक्स्ड रिटर्न निर्दिष्ट सरणी द्वारा समर्थित आकार सूची। (लौटाई गई सूची में परिवर्तन "सरणी के माध्यम से" लिखें।) "इसका मतलब है कि आपको केवल ऐरे का एक सूची दृश्य प्रदान किया जाता है जिसे आईएमओ रनटाइम पर बनाया गया है और आप आकार बदल नहीं सकते एक सरणी का ताकि आप "Arrays.asList" के आकार को भी बदल सकें।

void add(E e) 
{ 
//some unknown code 
throw(java.lang.UnsupportedOperationException); 
} 

इसलिए जब भी आप सरणी यह ​​UnsupportedOperationException फेंकता के आकार में परिवर्तन करने का प्रयास -

IMO Arrays.asList की आंतरिक कार्यान्वयन सभी कार्यान्वित तरीकों के रूप में सरणी के आकार बदल सकते हैं।

फिर भी यदि आप इस तरह के सिंटैक्स का उपयोग करके एक ऐरेलिस्ट में कुछ नए आइटम जोड़ना चाहते हैं, तो आप Arraylist का उप-वर्ग बनाकर ऐसा कर सकते हैं (अधिमानतः ArrayList के अज्ञात उपclass का उपयोग करके)। आप ArrayList के निर्माता को Arrays.List की वापसी प्रकार पारित कर सकते हैं, कुछ इस तरह (यानी सार्वजनिक ArrayList (संग्रह ग)।) -

List<String> girlFriends = new java.util.ArrayList<String>(Arrays.asList("Rose", "Leena", "Kim", "Tina")); 
girlFriends.add("Sarah"); 

अब आप आसानी से एक ही का उपयोग कर अपने GF सूची में सारा जोड़ सकते हैं वाक्य - विन्यास।

पीएस - कृपया इसे एक या दूसरे को अपने उत्तर के रूप में चुनें क्योंकि evrything समझाया गया है। आपकी कम स्वीकृति दर बहुत निराशाजनक है।

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