ArrayList बनाम लिंक्डलिस्ट बनाम वेक्टर

सॉफ्टवेयर इंजीनियरिंग की भूमिका में नौकरी करना लोगों की सोच से बहुत आसान है। लेकिन कुछ मामलों में, इस विशेषज्ञता में कई वर्षों के अनुभव वाले मेरे अधिकांश लोगों ने अपनी उम्मीदवारी को विफल कर दिया। "क्या समस्या है?" सवाल मेरे दिमाग में कौंध रहा है।

मैं अपने समय का आनंद ले रहा हूं क्योंकि सॉफ्टवेयर इंजीनियरिंग भूमिका भी बेहतर है जो मैं पिछले 6 वर्षों से अपने कोड के साथ कर रहा हूं। उस दौरान मेरे पास कई सॉफ्टवेयर इंजीनियरिंग उम्मीदवारों के साक्षात्कार के अद्भुत अनुभव थे। प्रत्येक साक्षात्कार प्रक्रिया में, मुझे उम्मीद नहीं है कि उम्मीदवारों को अच्छे सॉफ्टवेयर डिजाइन सिद्धांतों, स्केलेबल कोड आर्किटेक्चर, और परीक्षण जैसे विषयों में अच्छी तरह से आधार बनाया जाएगा, लेकिन सॉफ्टवेयर इंजीनियरिंग में डेटा संरचना और एल्गोरिथ्म के बुनियादी ज्ञान में भी उनका ज्ञान है। मुझे बहुत दुख हुआ जब बहुत से उम्मीदवारों को मूल समझ नहीं आई।

त्वरित शिक्षार्थी होने के अलावा, जो कुछ समय के भीतर नए ढांचे, उपकरण या यहां तक ​​कि प्रोग्रामिंग भाषाओं को सीख सकते हैं, डेटा संरचना की एक ठोस समझ रखना महत्वपूर्ण ज्ञान में से एक है जो आपके पास होना चाहिए यदि आप सॉफ्टवेयर इंजीनियर के रूप में अपना कैरियर बनाना चाहते हैं।

डेटा संरचना कंप्यूटर में सूचनाओं को संग्रहीत करने और व्यवस्थित करने का एक विशेष तरीका है ताकि इसे पुनः प्राप्त किया जा सके और इसका सबसे अधिक उपयोग किया जा सके। विभिन्न प्रकार के अनुप्रयोगों के लिए विभिन्न प्रकार की डेटा संरचनाएं होती हैं, और कुछ विशिष्ट कार्यों के लिए अत्यधिक विशिष्ट होती हैं। - विकिपीडिया

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

कौन सा बेहतर, ArrayList, LinkedList या वेक्टर?

सूची

प्रश्न का उत्तर देने से पहले, यह जानना अच्छा है कि सूची क्या है। सूची एक सार डेटा प्रकार (ADT) में से एक है जो अपने तत्वों को एक अनुक्रम में संग्रहीत करता है और हमें सूचकांक का उपयोग करके इसके तत्वों को जोड़ने, हटाने और उपयोग करने की अनुमति देता है। एरे एडीटी सूची को लागू करने वाली डेटा संरचनाओं में से एक है। ऐरे में, हम इंडेक्स का उपयोग करके तत्व जोड़, हटा सकते हैं और प्राप्त कर सकते हैं। ArrayList, LinkedList और वेक्टर डेटा संरचनाओं का एक और उदाहरण है जो ADT सूची को लागू करते हैं। जबकि ऐरे में एक बार घोषित होने के बाद स्थिर आकार होता है, ArrayList, LinkedList और वेक्टर में एक गतिशील आकार (आकार बदलने योग्य) होता है। यदि एक ऐरे को लंबाई 7 के साथ घोषित किया जाता है, तो इसके दायरे के अंत तक इसकी लंबाई 7 होगी। जबकि ArrayList, LinkedList और वेक्टर डेटा को यथासंभव स्टोर कर सकते हैं, जहां सीमा उपलब्ध मेमोरी की कुल है।

जावा संग्रह फ्रेमवर्क। स्रोत: विकिपीडिया

जावा संग्रह फ्रेमवर्क में, ADT सूची को एक इंटरफ़ेस के रूप में कार्यान्वित किया जाता है जिसे List कहा जाता है, और ArrayList, LinkedList & वेक्टर एक ठोस वर्ग है जो सूची इंटरफ़ेस को लागू करता है। चूंकि ये ठोस कक्षाएं समान इंटरफ़ेस को लागू करती हैं, इसलिए इन कक्षाओं की कार्यक्षमता समान होनी चाहिए क्योंकि सभी गैर-अमूर्त वर्गों के लिए जो इंटरफ़ेस को लागू करता है, इंटरफ़ेस में घोषित सभी सार विधियों को लागू करना आवश्यक है।

कैसे डेटा संग्रहीत

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

कंप्यूटर विज्ञान में, एक दोहरी लिंक की गई सूची एक लिंक डेटा संरचना है जिसमें क्रमिक रूप से लिंक किए गए रिकॉर्ड का एक सेट होता है, जिसे नोड्स कहा जाता है। प्रत्येक नोड में दो फ़ील्ड होते हैं, जिन्हें लिंक कहा जाता है, जो नोड्स के अनुक्रम में पिछले और अगले नोड के संदर्भ हैं। - विकिपीडिया
ArrayList (शीर्ष) बनाम लिंक्डलिस्ट (नीचे)। स्रोत https://dzone.com/storage/temp/895349-arraylist-linkedlistt.png

LinkedList में, पहला नोड दूसरा नोड जान सकता है। दूसरा नोड पहले और तीसरे नोड को जान सकता है। तीसरा नोड दूसरे और चौथे नोड्स को जान सकता है। और इसी तरह, एक नोड पिछले नोड और अगले नोड को जान सकता है। विशेष रूप से लिंक्डलिस्ट में पहले नोड के लिए, कोई पिछला नोड नहीं होगा और लिंक्डलिस्ट में आखिरी नोड भी नहीं होगा।

यहाँ कोड स्निपेट है कि कैसे ArrayList अपने तत्वों को Array में संग्रहीत करता है।

/ **
 * ऐरे बफर जिसमें एरियरिस्ट के तत्व होते हैं
 * संग्रहीत। ArrayList की क्षमता इस की लंबाई है
 * सरणी बफर। तत्वदत्त == के साथ कोई भी खाली ArrayList
 * DEFAULTCAPACITY_EMPTY_ELEMENTDATA का विस्तार किया जाएगा
 * DEFAULT_CAPACITY जब पहला तत्व जोड़ा जाता है।
 * /
क्षणिक वस्तु [] तत्वता; // नेस्टेड को सरल बनाने के लिए गैर-निजी
                                // क्लास एक्सेस

और यहाँ है कि कैसे वेक्टर अपने तत्वों को भी ऐरे में संग्रहीत करते हैं।

/ **
 * सरणी बफर जिसमें वेक्टर के घटक होते हैं
 * संग्रहीत। वेक्टर की क्षमता इस सरणी की लंबाई है
 * बफर, और कम से कम इतना बड़ा है जिसमें सभी वेक्टर हैं
 * तत्व।
 *
 * 

वेक्टर में अंतिम तत्व के बाद कोई भी सरणी तत्व  * अशक्त हैं।  *  * @धारावाहिक  * / संरक्षित वस्तु [] तत्वदत्ता;

उपरोक्त कोड स्निपेट में, हम देख सकते हैं कि ArrayList और वेक्टर दोनों अपने तत्वों को इसके प्रकार के रूप में elementDatawith Object [] नाम के एक चर में संग्रहीत करते हैं। क्यों वस्तु []? ऑब्जेक्ट जावा में सभी वर्गों का एक सुपर-क्लास है। ObjectData को Object [] के रूप में परिभाषित करके, फिर elementData विभिन्न प्रकार के तत्वों को संग्रहीत कर सकता है, यह String, Integer, Double, Float या कस्टम क्लास जैसे Pair, TextView और आगे हो सकता है।

क्यों ArrayList और वेक्टर एक Array का उपयोग करके अपने डेटा को स्टोर करता है? जैसा कि पहले उल्लेख किया गया है, हालांकि ArrayList और वेक्टर अपने डेटा को संग्रहीत करने के लिए सरणियों का उपयोग करता है, ArrayList और वेक्टर में गतिशील आकार (आकार बदलने योग्य) की क्षमता है। जब ArrayList और वेक्टर में उपयोग किया गया सरणी भरा हुआ है, तो वे अपनी क्षमता बढ़ाने के लिए "विकसित" कर सकते हैं। ArrayList और वेक्टर पिछले आकार की तुलना में बड़े आकार के साथ एक नया Array बनाकर अपनी क्षमता बढ़ाते हैं, फिर पुराने Array से नए Array से कमांड Arrays.copyOf का उपयोग करके सभी तत्वों को कॉपी करते हैं। यहाँ ArrayList पर कार्यक्रम की एक कोड स्निपेट है अपनी क्षमता को बढ़ाने के लिए (स्रोत: ArrayList.java)।

/ **
  * यह सुनिश्चित करने की क्षमता बढ़ाता है कि यह कम से कम पकड़ सके
  * न्यूनतम क्षमता तर्क द्वारा निर्दिष्ट तत्वों की संख्या।
  *
  * @ वानर न्यूनतम न्यूनतम क्षमता को मापता है
  * /
  निजी शून्य हो जाना (इंट मिनटपेसिटी) {
      // अतिप्रवाह-सचेत कोड
      int oldCapacity = elementData.length;
      int newCapacity = oldCapacity + (पुरानाकैपेसिटी >> 1);
      अगर (नयापन - न्यूनतम क्षमता <0)
          newCapacity = minCapacity;
      यदि (नयापन - MAX_ARRAY_SIZE> 0)
          newCapacity = विशालता (minCapacity);
      // न्यूनतम क्षमता आमतौर पर आकार के करीब है, इसलिए यह एक जीत है:
      elementData = Arrays.copyOf (elementData, newCapacity);
  }

और यहाँ है कि वेक्टर अपनी क्षमता कैसे बढ़ाता है (स्रोत: वेक्टर.जवा)

निजी शून्य हो जाना (इंट मिनटपेसिटी) {
    // अतिप्रवाह-सचेत कोड
    int oldCapacity = elementData.length;
    int newCapacity = पुरानेकैपेसिटी + ((क्षमता वृद्धि> 0)?
                                     क्षमता वृद्धि: पुरानी क्षमता);
    अगर (नयापन - न्यूनतम क्षमता <0)
        newCapacity = minCapacity;
    यदि (नयापन - MAX_ARRAY_SIZE> 0)
        newCapacity = विशालता (minCapacity);
    elementData = Arrays.copyOf (elementData, newCapacity);
}

वेक्टर कार्यान्वयन लगभग ArrayList के समान है, और केवल अंतर वेक्टर में सभी कार्यों को सिंक्रनाइज़ किया जाता है जो किसी भी विधि को बनाता है जो वेक्टर की सामग्री को छूता है वह थ्रेड सुरक्षित है।

तो कौन सा बेहतर, ArrayList, LinkedList या वेक्टर? इस सवाल का जवाब देने के लिए ArrayList और LinkedList के अंदर आम संचालन के प्रदर्शन की तुलना करें। चूंकि ArrayList और वेक्टर कार्यान्वयन लगभग समान है, इसलिए उनका प्रदर्शन भी लगभग समान होगा।

ArrayList और LinkedList के बीच प्रदर्शन की तुलना

उपरोक्त तालिका से, हम देख सकते हैं कि सभी ऑपरेशनों के लिए चांदी की गोली नहीं है। ArrayList यादृच्छिक पहुँच (प्राप्त) पर लिंक्डलिस्ट से बेहतर है। ArrayList LinkedList से बेहतर है क्योंकि ArrayList अपने तत्वों को एक Array में संग्रहीत करता है जबकि LinkedList अपने तत्वों को लिंक्ड नोड के भीतर संग्रहीत करता है। उदाहरण के लिए, 5 वां तत्व प्राप्त करने के लिए, ArrayList और वेक्टर सीधे सूचकांक का उपयोग करके अपना तत्व प्राप्त कर सकते हैं क्योंकि अनिवार्य रूप से एक सरणी है, जबकि LinkedList को पांचवें तत्व का पता लगाने के लिए पुनरावृत्त होना चाहिए, क्योंकि LinkedList में हम केवल पहले को जान सकते हैं और अंतिम तत्व केवल।

InsertFirst और deleteFirst के लिए, LinkedList ArrayList से बेहतर है। ArrayList को शुरुआत में (पहले सूचकांक) में एक तत्व जोड़ने या पहले तत्व को हटाने के लिए महान प्रयास की आवश्यकता होती है क्योंकि ArrayList को जोड़ने या हटाने के बाद निम्नलिखित तत्वों को स्थानांतरित करना होगा। जबकि लिंक्डलिस्ट को केवल अपने पॉइंटर्स को बदलने / सेट करने की आवश्यकता है। अन्य कार्यों के लिए, ArrayList और LinkedList दोनों का प्रदर्शन समान है।

तो कौन सा बेहतर, ArrayList, LinkedList या वेक्टर? अपनी आवश्यकताओं पर निर्भर हैं। यदि आप अधिक बार यादृच्छिक अभिगम (प्राप्त) का उपयोग करते हैं, तो ArrayList और वेक्टर एक अच्छा विकल्प है। यदि आपको थ्रेड-सुरक्षित संग्रह की आवश्यकता है, तो वेक्टर चुनें। लेकिन अगर आप अक्सर पहली स्थिति (इंडेक्स) पर जोड़ या विलोपन करते हैं, तो लिंक्डलिस्ट एक बेहतर विकल्प है।

एक और ADT है जो आमतौर पर सेट, मैप और प्रायोरिटी क्यू जैसे एप्लिकेशन को विकसित करते समय उपयोग किया जाता है। यह जानने के लिए कि वे अपने डेटा को कैसे स्टोर करते हैं, कैसे काम करते हैं और कब उपयोग करते हैं, मेरे माध्यम पर बने रहें।