.NET डेटा संरचनाएँ:
ArrayList और List वास्तव में अलग क्यों हैं, इसके बारे में अधिक बातचीत
Arrays
जैसा कि एक उपयोगकर्ता कहता है, Arrays "पुराना स्कूल" संग्रह है (हां, सरणियों को एक संग्रह माना जाता है, हालांकि इसका हिस्सा नहीं है System.Collections
)। लेकिन, अन्य संग्रह की तुलना में सरणियों के बारे में "पुराना स्कूल" क्या है, अर्थात जिन्हें आपने अपने शीर्षक में सूचीबद्ध किया है (यहाँ, ArrayList और List (T का))? आइए मूल अक्षर से शुरू करते हैं।
शुरू करने के लिए, Microsoft .NET में एरर्स हैं, "तंत्र जो आपको कई [तार्किक रूप से संबंधित] वस्तुओं को एक एकल संग्रह के रूप में व्यवहार करने की अनुमति देता है," (लिंक किए गए लेख देखें)। इसका क्या मतलब है? Arrays व्यक्तिगत सदस्यों (तत्वों) को क्रमिक रूप से संग्रहीत करता है, एक के बाद एक स्मृति में एक शुरुआती पते के साथ। सरणी का उपयोग करके, हम आसानी से उस पते पर शुरू होने वाले क्रमिक रूप से संग्रहीत तत्वों तक पहुंच सकते हैं।
उस से परे और 101 सामान्य अवधारणाओं के प्रोग्रामिंग के विपरीत, एर्रेज़ वास्तव में काफी जटिल हो सकता है:
Arrays एकल आयाम, बहुआयामी, या jadded हो सकता है (दांतेदार सरणियों के बारे में पढ़ने लायक हैं)। Arrays स्वयं गतिशील नहीं होती है: एक बार आरंभीकृत होने के बाद, n आकार की एक सरणी के पास n संख्या को रखने के लिए पर्याप्त स्थान होता है । सरणी में तत्वों की संख्या बढ़ या सिकुड़ नहीं सकती है। Dim _array As Int32() = New Int32(100)
100 इंट 32 आदिम प्रकार की वस्तुओं को रखने के लिए सरणी के लिए मेमोरी ब्लॉक पर पर्याप्त स्थान रखता है (इस मामले में, सरणी को 0s शामिल करने के लिए प्रारंभ किया जाता है)। इस ब्लॉक का पता वापस कर दिया गया है _array
।
लेख के अनुसार, कॉमन लैंग्वेज स्पेसिफिकेशन (CLS) के लिए आवश्यक है कि सभी सरणियाँ शून्य-आधारित हों। .NET में एरर नॉन-जीरो-आधारित एरेज़ को सपोर्ट करता है; हालाँकि, यह कम आम है। शून्य-आधारित सरणियों के "सामान्य-नेस" के परिणामस्वरूप, Microsoft ने अपने प्रदर्शन का अनुकूलन करने में बहुत समय बिताया है ; इसलिए, एकल आयाम, शून्य-आधारित (SZ) सरणियाँ "विशेष" हैं - और वास्तव में एक सरणी का सबसे अच्छा कार्यान्वयन (जैसा कि बहुआयामी के विपरीत, आदि) - क्योंकि SZ में उन्हें हेरफेर करने के लिए विशिष्ट मध्यस्थ भाषा निर्देश हैं।
एरे को हमेशा संदर्भ (एक स्मृति पते के रूप में) से पारित किया जाता है - जानने के लिए एरे पहेली का एक महत्वपूर्ण टुकड़ा। जबकि वे बाउंड चेकिंग करते हैं (एरर फेकेंगे), बार्ड चेकिंग को एरेज़ पर भी डिसेबल किया जा सकता है।
फिर से, सरणियों के लिए सबसे बड़ी बाधा यह है कि वे पुन: प्रयोज्य नहीं हैं। उनके पास "निश्चित" क्षमता है। प्रस्तुत है हमारे इतिहास के लिए ArrayList और List (T का):
ArrayList - गैर-सामान्य सूची
ArrayList (साथ साथ List(Of T)
- हालांकि वहाँ कुछ महत्वपूर्ण मतभेद हैं, यहाँ, बाद में समझाया गया है) - शायद संग्रह के बगल में इसके अलावा (व्यापक अर्थों में) के रूप में करने का सबसे अच्छा सोचा है। ArrayList को IList ('ICollection' का वंशज) इंटरफ़ेस से विरासत में मिला है। ArrayLists, खुद, भारी हैं - सूची से अधिक उपरि की आवश्यकता है ।
IList
ArrayLists को निश्चित आकार की सूचियों (जैसे Arrays) के रूप में व्यवहार करने के लिए कार्यान्वयन को सक्षम करता है; हालांकि, ArrayLists द्वारा जोड़े गए अतिरिक्त फ़ंक्शनैलिटी से परे, ArrayLists का उपयोग करने के लिए कोई वास्तविक लाभ नहीं हैं जो कि इस मामले में ArrayLists (Arrays के ऊपर) के रूप में निश्चित आकार के हैं, जो कि धीमी गति से हैं।
मेरे पढ़ने से, ArrayLists दांतेदार नहीं हो सकते: "तत्वों के रूप में बहुआयामी सरणियों का उपयोग करना ... समर्थित नहीं है"। फिर से, ArrayLists के ताबूत में एक और कील। ArrayLists भी "टाइप" नहीं हैं - जिसका अर्थ है, सब कुछ के नीचे, एक ArrayList केवल वस्तुओं का एक गतिशील सरणी है Object[]
:। ArrayLists को लागू करते समय, उनके ओवरहेड को फिर से जोड़ने पर बहुत सारे बॉक्सिंग (निहित) और अनबॉक्सिंग (स्पष्ट) की आवश्यकता होती है।
असंतुष्ट विचार: मुझे लगता है कि मुझे याद है कि या तो पढ़ना या मेरे एक प्रोफेसर से सुना है कि ऐरेलेस्ट एर्रेट्स से लिस्ट-टाइप कलेक्शंस में स्थानांतरित होने के प्रयास के कमीने वैचारिक बच्चे की तरह हैं, जबकि एक बार एरे में बहुत सुधार हुआ है। वे अब सबसे अच्छा विकल्प नहीं हैं क्योंकि संग्रह के संबंध में और विकास किया गया है
T की सूची): क्या ArrayList बन गया (और होने की उम्मीद है)
स्मृति उपयोग में अंतर काफी महत्वपूर्ण है, जहां एक सूची (Int32) ने एक ArrayList की तुलना में 56% कम मेमोरी का उपभोग किया, जिसमें एक ही आदिम प्रकार (ऊपर के सज्जन के जुड़े प्रदर्शन में 8 एमबी बनाम 19 एमबी: फिर से, यहां लिंक किया गया है ) यह 64-बिट मशीन द्वारा संयोजित परिणाम है। यह अंतर वास्तव में दो चीजों को प्रदर्शित करता है: पहला (1), एक बॉक्सिंग Int32- टाइप "ऑब्जेक्ट" (ArrayList) एक शुद्ध Int32 आदिम प्रकार (सूची) की तुलना में बहुत बड़ा है; दूसरा (2), अंतर 64-बिट मशीन के आंतरिक कामकाज के परिणामस्वरूप घातीय है।
तो, क्या अंतर है और एक सूची (टी) क्या है? MSDN एक के List(Of T)
रूप में परिभाषित करता है , "... वस्तुओं की एक दृढ़ता से टाइप की गई सूची जिसे सूचकांक द्वारा एक्सेस किया जा सकता है।" यहां महत्व "दृढ़ता से टाइप किया हुआ" बिट है: एक सूची (टी का) 'प्रकारों को पहचानता है और वस्तुओं को उनके प्रकार के रूप में संग्रहीत करता है। तो, एक और एक प्रकार के Int32
रूप में संग्रहीत किया जाता है । यह बॉक्सिंग और अनबॉक्सिंग के कारण उत्पन्न समस्याओं को समाप्त करता है।Int32
Object
MSDN इस अंतर को केवल प्राइमरी प्रकारों को संग्रहीत करने पर खेल में आता है और संदर्भ प्रकारों को निर्दिष्ट करता है। वास्तव में, अंतर वास्तव में बड़े पैमाने पर होता है: 500 से अधिक तत्व। अधिक दिलचस्प बात यह है कि MSDN प्रलेखन में लिखा है, "ArrayList वर्ग का उपयोग करने के बजाय सूची (T) वर्ग के विशिष्ट-विशिष्ट कार्यान्वयन का उपयोग करना आपके लिए है ...."
अनिवार्य रूप से, सूची (T का) ArrayList है, लेकिन बेहतर है। यह ArrayList का "सामान्य समकक्ष" है। ArrayList की तरह, इसे तब तक छाँटने की गारंटी नहीं है जब तक कि छांट दिया न जाए (आंकड़ा)। T की सूची) में कुछ अतिरिक्त कार्यक्षमता भी है।