जावा संग्रह फ्रेमवर्क

जावा संग्रह संरचना कक्षाओं इंटरफ़ेस का एक समूह है जो सामान्यतः पुन: प्रयोज्य संग्रह निर्दिष्ट संरचनाओं को लागू करता है। हालांकि इसे एक संरचनाके रूप में जाना जाता है, यह एक पुस्तकालय के रूप में काम करता है। संग्रह संरचना दोनों इंटरफेस प्रदान करता है जो विभिन्न संग्रहों और उन्हें लागू करने वाली कक्षाओं को परिभाषित करता है।

सरणियों से अंतर
संग्रह और सरणियाँ समान हैं कि वे दोनों वस्तुओं के संदर्भ रखते हैं और उन्हें एक समूह के रूप में प्रबंधित किया जा सकता है। हालाँकि, सरणियों के विपरीत, संग्रह को तत्काल होने पर एक निश्चित क्षमता निर्दिष्ट करने की आवश्यकता नहीं होती है। ऑब्जेक्ट जोड़े या हटाए जाने पर संग्रह स्वचालित रूप से आकार में बढ़ या घट सकते हैं। संग्रह में बुनियादी डेटा प्रकार के तत्व (आदिम प्रकार) जैसे int, long, या double नहीं हो सकते; इसके बजाय, वे रैपर क्लासेस जैसे इंटीजर, लॉन्ग या डबल रखते हैं।

इतिहास
पूर्व-J2SE 1.2|JDK 1.2 संस्करणों में जावा प्लेटफॉर्म के संग्रह कार्यान्वयन में कुछ डेटा संरचना वर्ग शामिल थे, लेकिन इसमें संग्रह संरचनाशामिल नहीं था। जावा ऑब्जेक्ट्स को समूहीकृत करने के लिए मानक तरीके सरणी, वेक्टर और हैशटेबल क्लासेस के माध्यम से थे, जो दुर्भाग्य से विस्तार करना आसान नहीं था, और एक मानक सदस्य इंटरफ़ेस को लागू नहीं किया। पुन: प्रयोज्य संग्रह डेटा संरचनाओं की आवश्यकता को पूरा करने के लिए, कई स्वतंत्र रूपरेखाएँ विकसित की गईं, डौग ली के कलेक्शंस पैकेज में सबसे ज्यादा इस्तेमाल किया जा रहा है, और रिकर्सन सॉफ्टवेयर जेनेरिक कलेक्शन लाइब्रेरी (जेजीएल), जिसका मुख्य लक्ष्य C++ मानक टेम्पलेट लाइब्रेरी (STL) के साथ संगति करना था। संग्रह ढांचे को मुख्य रूप से जोशुआ बलोच द्वारा डिजाइन और विकसित किया गया था, और इसे J2SE 1.2|JDK 1.2 में पेश किया गया था। इसने डौग ली के कलेक्शंस पैकेज से कई विचारों और कक्षाओं का पुन: उपयोग किया, जिसके परिणामस्वरूप इसे हटा दिया गया था। सन माइक्रोसिस्टम्स ने जेजीएल के विचारों का उपयोग नहीं करने का फैसला किया, क्योंकि वे एक कॉम्पैक्ट संरचनाचाहते थे, और सी ++ के साथ स्थिरता उनके लक्ष्यों में से एक नहीं थी। डौग ली ने बाद में एक संगामिति (कंप्यूटर विज्ञान) जावा पैकेज विकसित किया, जिसमें संग्रह से संबंधित नए वर्ग शामिल थे। J2SE 5.0 | JDK 5.0 में Java Concurrency के रूप में इन समवर्ती उपयोगिताओं का एक अद्यतन संस्करण शामिल किया गया था।

आर्किटेक्चर
जावा में लगभग सभी संग्रह java.util.Collection इंटरफ़ेस से प्राप्त किए गए हैं। संग्रह सभी संग्रहों के मूल भागों को परिभाषित करता है। इंटरफ़ेस क्रमशः एक संग्रह से जोड़ने और निकालने के लिए ऐड और हटाने  विधियों को बताता है। यह भी आवश्यक है toArray  विधि, जो संग्रह को संग्रह में सभी तत्वों के एक सरल सरणी में परिवर्तित करती है। अंत में, सम्‍मिलित  विधि जाँचती है कि संग्रह में कोई निर्दिष्ट तत्व है या नहीं। संग्रह इंटरफ़ेस java.lang.Iterable का उप-इंटरफ़ेस है, इसलिए कोई भी संग्रह प्रत्येक कथन का लक्ष्य हो सकता है। (Iterable इंटरफ़ेस प्रत्येक कथन के लिए उपयोग की जाने वाली iterator विधि प्रदान करता है।) सभी संग्रहों में एक पुनरावर्तक होता है जो संग्रह के सभी तत्वों से होकर जाता है। इसके अतिरिक्त, संग्रह एक सामान्य है। किसी भी वर्ग को स्टोर करने के लिए कोई भी संग्रह लिखा जा सकता है। उदाहरण के लिए, Collection स्ट्रिंग्स को होल्ड कर सकता है, और संग्रह के तत्वों को बिना किसी कास्टिंग के स्ट्रिंग्स के रूप में उपयोग किया जा सकता है। ध्यान दें कि कोणीय कोष्ठक < > एक प्रकार का तर्क रख सकता है जो निर्दिष्ट करता है कि संग्रह किस प्रकार का है।

संग्रह के तीन प्रकार
संग्रह के तीन सामान्य प्रकार हैं: आदेशित सूचियाँ, शब्दकोश/नक्शे और सेट।

आदेशित सूचियाँ प्रोग्रामर को एक निश्चित क्रम में आइटम सम्मिलित करने और उसी क्रम में उन वस्तुओं को पुनः प्राप्त करने की अनुमति देती हैं। एक उदाहरण प्रतीक्षा सूची है। आदेशित सूचियों के लिए आधार इंटरफेस को सूची और कतार कहा जाता है।

शब्दकोश/मानचित्र वस्तु के मूल्यों तक पहुँचने के लिए एक लुकअप कुंजी के साथ वस्तुओं के संदर्भों को संग्रहीत करते हैं। कुंजी का एक उदाहरण एक पहचान पत्र है। शब्दकोशों/नक्शों के लिए आधार इंटरफेस को मानचित्र कहा जाता है।

सेट अनियंत्रित संग्रह होते हैं जिन्हें पुनरावृत्त किया जा सकता है और प्रत्येक तत्व को एक बार में शामिल किया जा सकता है। सेट के लिए बेस इंटरफ़ेस को सेट कहा जाता है।

सूची इंटरफ़ेस
सूचियाँ java.util.List इंटरफ़ेस के माध्यम से संग्रह ढांचे में कार्यान्वित की जाती हैं। यह एक सूची को अनिवार्य रूप से एक सरणी के अधिक लचीले संस्करण के रूप में परिभाषित करता है। तत्वों का एक विशिष्ट क्रम होता है, और डुप्लिकेट तत्वों की अनुमति होती है। तत्वों को एक विशिष्ट स्थिति में रखा जा सकता है। उन्हें सूची के भीतर भी खोजा जा सकता है। सूची लागू करने वाले ठोस वर्गों के दो उदाहरण हैं:


 * java.util.ArrayList, जो सूची को एक सरणी के रूप में लागू करता है। जब भी किसी सूची के लिए विशिष्ट कार्यों की आवश्यकता होती है, तो वर्ग इसे करने के लिए तत्वों को सरणी के भीतर ले जाता है।
 * java.util.LinkedList. यह वर्ग उन तत्वों को नोड्स में संग्रहीत करता है जिनमें प्रत्येक के पास सूची में पिछले और अगले नोड्स के लिए एक सूचक होता है। पॉइंटर्स का पालन करके सूची को पार किया जा सकता है, और नोड को उसके उचित स्थान पर रखने के लिए केवल पॉइंटर्स को बदलकर तत्वों को जोड़ा या हटाया जा सकता है।

ढेर वर्ग
Java.util.Stack का उपयोग करके स्टैक बनाए जाते हैं। स्टैक स्टैक पर एक नई वस्तु डालने के तरीके प्रदान करता है (विधि पुश ) और स्टैक से ऑब्जेक्ट प्राप्त करने के लिए (विधि पॉप )। स्टैक ऑब्जेक्ट को लास्ट-इन-फर्स्ट-आउट (LIFO) के अनुसार लौटाता है, उदा। स्टैक पर नवीनतम रखी गई वस्तु पहले वापस आ जाती है। java.util.Stack जावा द्वारा प्रदान किए गए स्टैक का एक मानक कार्यान्वयन है। स्टैक क्लास ऑब्जेक्ट्स के लास्ट-इन-फर्स्ट-आउट (LIFO) स्टैक का प्रतिनिधित्व करता है। यह क्लास java.util.Vector को पांच ऑपरेशंस के साथ विस्तारित करता है जो एक वेक्टर को स्टैक के रूप में व्यवहार करने की अनुमति देता है। सामान्य पुश और पॉप ऑपरेशन प्रदान किए जाते हैं, साथ ही स्टैक पर शीर्ष आइटम को देखने के लिए एक विधि, स्टैक खाली है या नहीं, यह जांचने के लिए एक विधि, और किसी आइटम के लिए स्टैक की खोज करने और यह पता लगाने की विधि कितनी दूर है ऊपर से है। जब स्टैक पहली बार बनाया जाता है, तो इसमें कोई आइटम नहीं होता है।

कतार इंटरफेस
Java.util.Queue इंटरफ़ेस कतार डेटा संरचना को परिभाषित करता है, जो तत्वों को उस क्रम में संग्रहीत करता है जिसमें वे डाले गए हैं। नए जोड़े लाइन के अंत में जाते हैं, और तत्वों को सामने से हटा दिया जाता है। यह फर्स्ट-इन फर्स्ट-आउट सिस्टम बनाता है। यह इंटरफ़ेस java.util.LinkedList, java.util.ArrayDeque, और java.util.PriorityQueue द्वारा कार्यान्वित किया गया है। लिंक्डलिस्ट, निश्चित रूप से, सूची इंटरफ़ेस को भी लागू करता है और इसे एक के रूप में भी इस्तेमाल किया जा सकता है। लेकिन इसमें कतार के तरीके भी हैं। ArrayDeque कतार को एक सरणी के रूप में लागू करता है। LinkedList और ArrayDeque दोनों ही java.util.Deque इंटरफ़ेस को लागू करते हैं, जिससे इसे और अधिक लचीलापन मिलता है। java.util.Queue को इसके सबइंटरफेस, java.util.concurrent.BlockingQueue के साथ अधिक लचीले ढंग से उपयोग किया जा सकता है। BlockingQueue इंटरफ़ेस एक नियमित कतार की तरह काम करता है, लेकिन कतार में जोड़ने और हटाने से अवरुद्ध हो रहा है। यदि खाली क्यू पर रिमूव को कॉल किया जाता है, तो इसे कतार में किसी आइटम के प्रकट होने के लिए या तो निर्दिष्ट समय या अनिश्चित काल तक प्रतीक्षा करने के लिए सेट किया जा सकता है। इसी तरह, किसी आइटम को जोड़ना कतार पर एक वैकल्पिक क्षमता प्रतिबंध के अधीन है, और विधि लौटने से पहले कतार में स्थान उपलब्ध होने की प्रतीक्षा कर सकती है। java.util.PriorityQueue java.util.Queue को लागू करता है, लेकिन इसे बदल भी देता है। तत्वों को उस क्रम में क्रमबद्ध करने के बजाय जिसमें वे डाले गए हैं, उन्हें प्राथमिकता के आधार पर क्रमबद्ध किया जाता है। प्राथमिकता निर्धारित करने के लिए उपयोग की जाने वाली विधि या तो तत्वों में तुलना विधि या कंस्ट्रक्टर में दी गई विधि है। वर्ग वस्तुओं को क्रमबद्ध रखने के लिए हीप का उपयोग करके इसे बनाता है।

डबल-एंडेड कतार (डीक्यू) इंटरफेस
Java.util.Queue इंटरफ़ेस को java.util.Deque सबइंटरफ़ेस द्वारा विस्तारित किया गया है। Deque एक डबल-एंडेड कतार बनाता है। जबकि एक नियमित कतार केवल पीछे की ओर सम्मिलन और आगे की ओर हटाने की अनुमति देती है, डेक सम्मिलन या निष्कासन को आगे और पीछे दोनों जगह करने की अनुमति देता है। एक डेक एक कतार की तरह है जिसे आगे या पीछे, या दोनों एक साथ इस्तेमाल किया जा सकता है। इसके अतिरिक्त, आगे और पीछे दोनों इटरेटर उत्पन्न किए जा सकते हैं। डेक इंटरफ़ेस java.util.ArrayDeque और java.util.LinkedList द्वारा कार्यान्वित किया जाता है। Java.util.concurrent.BlockingDeque इंटरफ़ेस java.util.concurrent.BlockingQueue के समान काम करता है। सम्मिलन और हटाने के लिए सम्मिलन की प्रतीक्षा करने या संभव होने के लिए हटाने के लिए समय सीमा के साथ हटाने के लिए समान तरीके प्रदान किए जाते हैं। हालाँकि, इंटरफ़ेस डेक का लचीलापन भी प्रदान करता है। सम्मिलन और निष्कासन दोनों सिरों पर हो सकता है। ब्लॉकिंग फ़ंक्शन को डेक फ़ंक्शन के साथ जोड़ा जाता है।

इंटरफेस सेट करें
Java का java.util.Set इंटरफ़ेस सेट को परिभाषित करता है। एक सेट में कोई डुप्लिकेट तत्व नहीं हो सकते। इसके अतिरिक्त, सेट का कोई निर्धारित क्रम नहीं है। इसलिए, तत्वों को इंडेक्स द्वारा नहीं पाया जा सकता है। सेट java.util.HashSet, java.util.LinkedHashSet, और java.util.TreeSet द्वारा कार्यान्वित किया जाता है। हैशसेट हैश टेबल का उपयोग करता है। अधिक विशेष रूप से, यह हैश और तत्वों को स्टोर करने और डुप्लीकेट को रोकने के लिए java.util.HashMap का उपयोग करता है। java.util.LinkedHashSet एक दोगुनी लिंक्ड सूची बनाकर इसका विस्तार करता है जो सभी तत्वों को उनके सम्मिलन क्रम से जोड़ता है। यह सुनिश्चित करता है कि सेट पर पुनरावृत्ति क्रम अनुमानित है। java.util.TreeSet एक java.util.TreeMap द्वारा कार्यान्वित एक लाल-काले पेड़ का उपयोग करता है। लाल-काले पेड़ यह सुनिश्चित करते हैं कि कोई डुप्लिकेट न हो। इसके अतिरिक्त, यह ट्रीसेट को java.util.SortedSet को लागू करने की अनुमति देता है। Java.util.Set इंटरफ़ेस को java.util.SortedSet इंटरफ़ेस द्वारा विस्तारित किया गया है। नियमित सेट के विपरीत, सॉर्ट किए गए सेट में तत्वों को सॉर्ट किया जाता है, या तो तत्व की तुलना करने के लिए विधि, या सॉर्ट किए गए सेट के निर्माता को प्रदान की गई विधि। सॉर्ट किए गए सेट के पहले और अंतिम तत्वों को पुनर्प्राप्त किया जा सकता है, और सबसेट को न्यूनतम और अधिकतम मानों के माध्यम से बनाया जा सकता है, साथ ही साथ सॉर्ट किए गए सेट की शुरुआत या समाप्ति पर भी। SortedSet इंटरफ़ेस java.util.TreeSet द्वारा लागू किया गया है। java.util.SortedSet को java.util.NavigableSet इंटरफ़ेस के माध्यम से आगे बढ़ाया गया है। यह सॉर्टेडसेट के समान है, लेकिन कुछ अतिरिक्त तरीके हैं। मंजिल, छत , निचला , और उच्च विधियाँ सेट में एक तत्व खोजती हैं जो पैरामीटर के करीब है। इसके अतिरिक्त, सेट में आइटम्स पर अवरोही पुनरावर्तक प्रदान किया जाता है। सॉर्टेडसेट के साथ, java.util.TreeSet नेविगेबलसेट को लागू करता है।

मैप इंटरफेस
मानचित्र जावा में java.util.Map इंटरफ़ेस द्वारा परिभाषित किए गए हैं। मानचित्र सरल डेटा संरचनाएं हैं जो एक कुंजी को एक तत्व से जोड़ती हैं। इससे मानचित्र बहुत लचीला हो जाता है। यदि कुंजी तत्व का हैश कोड है, तो मानचित्र अनिवार्य रूप से एक सेट है। यदि यह केवल एक बढ़ती हुई संख्या है, तो यह एक सूची बन जाती है। नक्शे java.util.HashMap, java.util.LinkedHashMap, और java.util.TreeMap द्वारा कार्यान्वित किए जाते हैं। हैश मैप हैश तालिका का उपयोग करता है। कुंजियों के हैश का उपयोग विभिन्न बाल्टियों में तत्वों को खोजने के लिए किया जाता है। LinkedHashMap तत्वों के बीच एक दोगुनी लिंक्ड सूची बनाकर इसे बढ़ाता है, जिससे उन्हें उस क्रम में एक्सेस किया जा सकता है जिसमें वे मानचित्र में डाले गए थे। ट्रीमैप, हैश मैप और लिंक्ड हैश मैप के विपरीत, एक लाल-काले पेड़ का उपयोग करता है। कुंजियों का उपयोग पेड़ में नोड्स के मान के रूप में किया जाता है, और नोड्स मानचित्र में तत्वों को इंगित करते हैं। Java.util.Map इंटरफ़ेस को इसके सबइंटरफ़ेस, java.util.SortedMap द्वारा विस्तारित किया गया है। यह इंटरफ़ेस एक मानचित्र को परिभाषित करता है जिसे प्रदान की गई कुंजियों द्वारा क्रमबद्ध किया जाता है। एक बार फिर, तुलना करने के लिए विधि या सॉर्ट किए गए मानचित्र के निर्माता में प्रदान की गई विधि का उपयोग करके, कुंजी-तत्व जोड़े को कुंजियों द्वारा क्रमबद्ध किया जाता है। मानचित्र में पहली और अंतिम कुंजियों को कहा जा सकता है। इसके अतिरिक्त, सबमैप न्यूनतम और अधिकतम कुंजियों से बनाए जा सकते हैं। SortedMap java.util.TreeMap द्वारा कार्यान्वित किया जाता है। Java.util.NavigableMap इंटरफ़ेस Java.util.SortedMap को विभिन्न तरीकों से विस्तारित करता है। विधियों को बुलाया जा सकता है जो किसी भी दिशा में दी गई कुंजी के निकटतम कुंजी या मानचित्र प्रविष्टि को ढूंढते हैं। मानचित्र को उल्टा भी किया जा सकता है, और इससे उल्टे क्रम में एक पुनरावर्तक उत्पन्न किया जा सकता है। इसे java.util.TreeMap द्वारा कार्यान्वित किया गया है।

जावा संग्रह ढांचे के लिए एक्सटेंशन
जावा संग्रह ढांचे को अपाचे कॉमन्स कलेक्शंस लाइब्रेरी द्वारा विस्तारित किया गया है, जो संग्रह प्रकार जैसे बैग और द्विदिश मानचित्र, साथ ही यूनियनों और चौराहों को बनाने के लिए उपयोगिताओं को जोड़ता है। Google ने Google अमरूद के हिस्से के रूप में अपनी संग्रह लाइब्रेरी जारी की है।

यह भी देखें

 * संग्रह (सार डेटा प्रकार)
 * कंटेनर (सार डेटा प्रकार)
 * मानक टेम्पलेट लाइब्रेरी
 * जावा समवर्ती
 * जावा समवर्ती मानचित्र