2010-04-20 7 views
9

LinkedList और ArrayList के बीच क्या अंतर है? मुझे कैसे पता चलेगा कि किस का उपयोग करना है?लिंक्डलिस्ट और ऐरेलिस्ट के बीच क्या अंतर है, और किसका उपयोग करना है?

+0

सरल ArrayList के लिए, कभी नहीं। जेनेरिक संग्रह 'IList ' और संबंधित का उपयोग करें। –

उत्तर

9

या तो उपयोग न करें। System.Collections.Generic.List<T> का उपयोग करें।

यह वास्तव में मेरी सिफारिश है। संभवतः स्वतंत्र रूप से आपका आवेदन क्या है, लेकिन यहां कुछ और रंग है, यदि आप ऐसा कुछ कर रहे हैं जिसके लिए यहां बारीकी से ट्यून किए गए विकल्प की आवश्यकता है।

ArrayList और LinkedListList के लिए स्टोरेज तंत्र के विभिन्न कार्यान्वयन हैं। ArrayList एक सरणी का उपयोग करता है जिसे आकार बदलना चाहिए यदि आपका संग्रह वर्तमान स्टोरेज आकार को बढ़ा देता है। दूसरी ओर LinkedList सीएस 201 से लिंक की गई सूची डेटा संरचना का उपयोग करता है। LinkedList कुछ सिर- या पूंछ-सम्मिलित भारी वर्कलोड के लिए बेहतर है, लेकिन ArrayList यादृच्छिक एक्सेस वर्कलोड के लिए बेहतर है।

+0

जब आप स्पष्ट रूप से पूछते हैं कि प्रत्येक (सरणी v। लिंक) सबसे अच्छा है तो आप हमेशा सरणी-आधारित सूची का उपयोग करने की अनुशंसा क्यों करेंगे? –

+1

मेरा मुद्दा यह है कि आपको आमतौर पर पसंद पर अधिक परेशानी नहीं होती है। बेस क्लास लाइब्रेरीज़ में बहुत से स्थान हैं जहां आपको एक सूची वापस मिलती है चाहे आप जो चाहते हैं वह हो या नहीं। ('* .सूची()') 'लिंक्डलिस्ट' 'IList' को भी लागू नहीं करता है, इसलिए इसे स्वचालित रूप से 'सूची' संदर्भों में उपयोग नहीं किया जा सकता है। यदि आपको प्रदर्शन कारणों से 'लिंक्डलिस्ट' का उपयोग करने की आवश्यकता है, तो यह पूरी तरह से ठीक है, लेकिन औसतन आप लाभ से अधिक खो रहे हैं। – sblom

+0

कोई भी नहीं कहा कि आपको परेशान होना चाहिए। यह आमतौर पर अपेक्षाकृत सरल निर्णय होता है। मुझे समझ में नहीं आता कि आपको क्यों लगता है कि आपको 'सूची' का उपयोग करना चाहिए क्योंकि मानक पुस्तकालय के कुछ हिस्सों में ऐसा होता है। 'लिंक्डलिस्ट' जानबूझकर लोगों को दुरुपयोग करने वाले लोगों को कम करने के लिए 'IList' को लागू नहीं करता है। यहां तक ​​कि यह सच था कि "औसतन आप हार रहे हैं", ओपी ने औसत के बारे में नहीं पूछा था। उन्होंने * कब * प्रत्येक का उपयोग करने के बारे में पूछा। –

4

अंतर कैसे List इंटरफ़ेस * कार्यान्वित किया जाता है के शब्दों में निहित है:

http://en.wikipedia.org/wiki/Arraylist और http://en.wikipedia.org/wiki/LinkedList


* मतलब basic list operations

+1

आप इन विकिपीडिया लेखों पर प्रत्येक ऑपरेशन की एल्गोरिदमिक जटिलता की जांच कर सकते हैं। – pgb

+0

इंटरफ़ेस 'IList ' है, लेकिन' लिंक्डलिस्ट 'इसे कार्यान्वित नहीं करता है (शायद जानबूझकर, खराब एल्गोरिदम को हतोत्साहित करने के लिए)। –

+1

'सूची 'एक इंटरफ़ेस नहीं है, और न ही' ArrayList 'और न ही' लिंक्डलिस्ट 'लागू करें' IList ' लागू करें। – Lee

11

अंतर आंतरिक डेटा संरचना करने के लिए प्रयोग किया जाता है वस्तुओं को स्टोर करें।

एक ArrayList एक सिस्टम सरणी (जैसे Object[]) का उपयोग करेगा और आवश्यकता होने पर इसका आकार बदल देगा। दूसरी ओर, LinkedList उस ऑब्जेक्ट का उपयोग करेगा जिसमें सूची में अगली और पिछली वस्तुओं के लिए डेटा और पॉइंटर शामिल होगा।

आंतरिक प्रतिनिधित्व में इस अंतर के कारण विभिन्न परिचालनों में अलग-अलग एल्गोरिदमिक जटिलता होगी।

2

उनके पास "आवेषण" (नए तत्व जोड़ना) और लुकअप पर अलग प्रदर्शन है। आवेषण के लिए ArrayLists आंतरिक रूप से एक सरणी रखता है (प्रारंभ में 16 आइटम लंबा) और जब आप अधिकतम क्षमता तक पहुंचते हैं तो यह सरणी के आकार को दोगुना करता है। एक लिंक्डलिस्ट खाली हो जाता है और आवश्यकता होने पर एक आइटम (नोड) जोड़ता है।

मुझे लगता है कि एरेलेस्टिस्ट के साथ आप आइटम को इंडेक्स करने में सक्षम हैं, जबकि लिंक्डलिस्ट के साथ आपको सिर से आइटम "विज़िट" करना होगा (या लिंक्डलिस्ट यह आपके लिए स्वचालित रूप से करता है)।

+0

लिंक्डलिस्ट में ओ (1) डिलीट भी हैं, जबकि 'सूची ' और 'ऐरेलिस्ट' औसत पर ओ (एन) हैं (एक प्रतिलिपि तब तक जरूरी है जब तक कि डिलीट पूंछ पर न हो)। –

3

ArrayList और List<T>, LinkedList<T>, और अन्य समान जेनेरिक्स के बीच मुख्य अंतर यह है कि ArrayList रखती Object रों है, जबकि अन्य एक प्रकार है कि आपके द्वारा निर्दिष्ट पकड़ (यानी। List<Point> केवल अंक रखती है)।

इस वजह से, आपको किसी भी वस्तु को ArrayList से अपने वास्तविक प्रकार में डालने की आवश्यकता है। यदि आपके पास लंबी कक्षा के नाम हैं तो इसमें बहुत सी स्क्रीन स्पेस लग सकती है।

आम तौर पर List<T> और अन्य टाइप किए गए जेनेरिक का उपयोग करना बेहतर होता है जब तक कि आपको वास्तव में इसमें कई अलग-अलग प्रकार की वस्तुओं के साथ एक सूची की आवश्यकता नहीं होती है।

7

ArrayList में एक अच्छा प्रतिस्थापन है जो List<T> है।

सामान्य तौर पर, List<T> सरणी के लिए एक आवरण है - यह में अनुक्रमण और तक पहुँचने की अनुमति देता है आइटम हे (1), लेकिन, हर बार जब आप क्षमता से अधिक एक हे (एन) भुगतान किया जाना चाहिए।

LinkedList<T> आप सूचकांक का उपयोग कर आइटम एक्सेस नहीं दूँगी लेकिन आप भरोसा कर सकते हैं कि डालने हमेशा खर्च होंगे हे (1)। इसके अतिरिक्त, आप सूची की शुरुआत में और मौजूदा वस्तुओं के बीच ओ (1) में आइटम सम्मिलित कर सकते हैं।

मुझे लगता है कि ज्यादातर मामलों में List<T> डिफ़ॉल्ट विकल्प है। कई सामान्य परिदृश्यों में विशेष आदेश की आवश्यकता नहीं होती है और इसमें कोई सख्त जटिलता बाधा नहीं होती है, इसलिए List<T> इसकी उपयोग सादगी के कारण पसंद किया जाता है।

2

जैसा कि @ एसब्लॉम ने कहा है, लिंक्डलिस्ट और ऐरेलिस्ट के सामान्य समकक्षों का उपयोग करें। वास्तव में ऐसा करने का कोई कारण नहीं है, और ऐसा करने के कई कारण हैं।

सूची < टी > कार्यान्वयन प्रभावी रूप से एक ऐरे लपेट रहा है। एक समर्थन सरणी की सीमा से परे तत्वों को सम्मिलित करने के उपयोगकर्ता का प्रयास, यह (काफी कीमत पर, buit पारदर्शी रूप से सूची के उपयोगकर्ताओं < टी > करने के लिए) एक बड़ा सरणी में कॉपी किया जायेगा चाहिए

एक LinkedList < टी > है पूरी तरह से अलग कार्यान्वयन जिसमें डेटा LinkedListNode < टी > उदाहरणों में होता है, जो दो अन्य लिंक्ड लिस्ट नोड < टी > उदाहरणों (या सूची के सिर या पूंछ के मामले में केवल एक) के संदर्भ में है। मध्य सूची आइटमों का कोई बाहरी संदर्भ नहीं बनाया गया है। इसका मतलब यह है कि सूची को फिर से चालू करना तेज है, लेकिन यादृच्छिक-पहुंच धीमी है, क्योंकि किसी को नोड्स को एक छोर या दूसरे से फिर से चालू करना होगा। लिंक्डलिस्ट का उपयोग करने का सबसे अच्छा कारण तेजी से आवेषण की अनुमति देना है, जिसमें नोड्स द्वारा आयोजित संदर्भों को बदलने के बजाय पूरी सूची को फिर से लिखने के बजाय नोड्स द्वारा आयोजित संदर्भों को बदलना शामिल है (जैसा कि सूची < टी > के साथ मामला है)

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