2011-01-11 5 views
35

मुझे हाल ही में पता चला है कि वास्तव में जावा में 2 अलग-अलग ArrayList कार्यान्वयन हैं (मुझे लगता है कि इससे पहले कभी देर हो चुकी है ...)।Arrays.asList() अपने स्वयं के ArrayList कार्यान्वयन को वापस क्यों करता है

तो मैं सोच रहा था कि Arrays.asList(T... a) को एक सूची वापस करने की आवश्यकता क्यों है जिसका आकार बदला नहीं जा सकता है? अगर उन्हें एक अपरिवर्तनीय सूची की आवश्यकता है तो set(int index, E element) विधि क्यों जोड़ें?

तो मेरा सामान्य सवाल यह है कि Arrays.asList(T... a) विधि से java.util.ArrayList वापस क्यों न करें?

इसके अलावा java.util.Arrays.ArrayList कार्यान्वयन के साथ आप क्या हासिल करते हैं?

उत्तर

40

आप से पूछा:

इसके अलावा क्या आप java.util.Arrays.ArrayList कार्यान्वयन के साथ प्राप्त करते हैं?

ऐसा इसलिए है क्योंकि Arrays $ ArrayList Arrays.asList द्वारा लौटाया गया है मूल सरणी पर बस एक दृश्य है। तो जब मूल सरणी बदल जाती है तो दृश्य भी बदल जाता है।

यदि कोई वास्तविक ऐरेलिस्ट का उपयोग करेगा तो तत्वों की प्रतिलिपि बनाई जाएगी, और ऑरगनल सरणी पर एक बदलाव ArrayList को प्रभावित नहीं करेगा।

  • प्रदर्शन: anyting
  • स्मृति कुशल कॉपी करने की कोई जरूरत:

    कारणों यह काफी सरल हैं करने के लिए कोई दूसरी सरणी की जरूरत है

+1

बस जवाब मैं धन्यवाद के लिए देख रहा था! कारणों को छोड़कर – Simeon

+1

सच है। दस्तावेज़ों का अर्थ केवल सरणी और संग्रह अड्डों के बीच एक पुल होने के लिए डेटा लिखने के माध्यम से एपीआई – sblundy

+0

@ एसब्लूंडी और डॉक्स अर्थ न केवल दुल्हन है "यह विधि कई तत्वों को रखने के लिए एक निश्चित आकार आईएसटी शुरू करने का एक सुविधाजनक तरीका भी प्रदान करती है" । लेकिन मैं आपको वोट देता हूं। – Ralph

5

वे विभिन्न व्यवहारों के साथ दो अलग-अलग वर्ग हैं।

जब आप Arrays.asList कहलाते हैं तो सूची वापस आती है, सरणी पर एक पतली आवरण नहीं है, प्रतिलिपि नहीं। लौटाई गई सूची निश्चित आकार है: add पर कॉल करने का प्रयास UnsupportedOperationException अपवाद फेंक देगा।

दूसरी ओर java.util.ArrayList डेटा की अपनी आंतरिक प्रति रखता है और परिवर्तनीय आकार है।

12

जावाडोक कहता है कि asList "निर्दिष्ट सरणी द्वारा समर्थित एक निश्चित आकार की सूची" देता है। यदि आप सरणी का आकार बदलना चाहते हैं, तो आपको एक नया बनाना होगा और पुराने डेटा की प्रतिलिपि बनाना होगा। सूची के मुकाबले एक ही सरणी उदाहरण से समर्थित नहीं होगा। कहा गया लक्ष्य "यह विधि सरणी-आधारित और संग्रह-आधारित API के बीच पुल के रूप में कार्य करती है।" और इसलिए अंतर्निहित सरणी को लिखना एक डिजाइन आवश्यकता है।

5

Arrays.asList को उस सूची को वापस करने की आवश्यकता है जिसे आकार में नहीं बदला जा सकता है - क्योंकि अंतर्निहित सरणी का आकार बदला नहीं जा सकता है - लेकिन यह संशोधित है - क्योंकि अंतर्निहित सरणी में तत्वों को असाइनमेंट की अनुमति है।

3

वास्तव में आप तत्वों को जोड़ने के लिए सक्षम हैं जोड़ने के साथ ArrayList करने के लिए। इस तरह की विधि:

List<String> l2= new ArrayList<String>(Arrays.asList(array1)); 
l2.add("blueCheese"); 

मेरी राय में आप इसे सूची की विशेषताओं को प्राप्त करने के लिए इसका उपयोग करते हैं लेकिन उन्हें ऐरे में लागू करते हैं।

+3

नहीं, आप java.utils.Arrays.ArrayList में तत्व जोड़ने में सक्षम नहीं हैं Arrays.asList (T ... a) से लौटाया गया है। आपका कोड स्निपेट एक नया java.util.ArrayList बनाता है, जो आप दिखाते हैं, #add का समर्थन करता है। – dgtc

1

दो टिप्पणियां:

1, सूची इंटरफेस की विधि निकालें() कॉल एक UnsupportedOperationException फेंक होगा द्वारा दिया सरणी हटना करने का प्रयास। ऐसा इसलिए है क्योंकि Arrays वर्ग के अंदर आंतरिक ArrayList क्लास सारसूची को बढ़ाती है, और सारसूची में निकालें() विधि असमर्थित अपवाद फेंकता है।

इस प्रकार सूची लौटने के बाद, आप सरणी में या लौटाई गई सूची में मौजूदा तत्वों को ओवरस्टोर कर सकते हैं, लेकिन आपको सरणी को बढ़ाने या सरणी को कम करने की अनुमति नहीं है।

  1. के जवाब में:

    वास्तव में आप ऐड साथ ArrayList करने के लिए तत्वों को जोड़ने में सक्षम हैं। इस तरह की विधि: सूची l2 = new ArrayList (Arrays.asList (array1)); l2.add ("blueCheese");

एल 2 सूची की एक स्वतंत्र प्रति है, इसलिए सूची एल 2 अब मूल सरणी & सूची से decoupled है। तो l2 में blueheheese, लेकिन मूल सरणी/सूची में नहीं है जो एक दूसरे से बैक अप लिया गया था।

-dbednar

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