मुझे किस जावा संग्रह का उपयोग करना चाहिए?


127

इस प्रश्न में मैं C ++ 11 में मानक पुस्तकालय कंटेनर का कुशलता से चयन कैसे कर सकता हूं? C ++ संग्रह चुनते समय उपयोग करने के लिए एक आसान प्रवाह चार्ट है।

मैंने सोचा कि यह उन लोगों के लिए एक उपयोगी संसाधन था जो सुनिश्चित नहीं हैं कि वे किस संग्रह का उपयोग कर रहे हैं इसलिए मैंने जावा के लिए समान प्रवाह चार्ट खोजने की कोशिश की और ऐसा करने में सक्षम नहीं था।

जावा में प्रोग्रामिंग करते समय उपयोग करने के लिए लोगों को सही संग्रह चुनने में मदद करने के लिए कौन से संसाधन और "चीट शीट" उपलब्ध हैं? लोगों को कैसे पता चलेगा कि उन्हें क्या सूची, सेट और मानचित्र कार्यान्वयन का उपयोग करना चाहिए?


Java Generics and Collections (Naftalin & Wadler) पुस्तक में इस बारे में एक अध्याय है।
क्रिस्टोफ रूसो

जवाबों:


292

चूँकि मैं एक समान फ्लोचार्ट नहीं ढूँढ पाया था इसलिए मैंने खुद को बनाने का फैसला किया।

यह फ्लो चार्ट सिंक्रोनाइज़्ड एक्सेस, थ्रेड सेफ्टी आदि या लीगेसी कलेक्शन जैसी चीजों को कवर करने की कोशिश नहीं करता है, लेकिन यह 3 मानक सेट s, 3 मानक मैप s और 2 मानक सूची s को कवर करता है ।

यहाँ छवि विवरण दर्ज करें

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

अन्य संसाधन

संभवतः सबसे उपयोगी अन्य संदर्भ ओरेकल प्रलेखन से निम्नलिखित पृष्ठ है जो प्रत्येक संग्रह का वर्णन करता है ।

हैशसेट बनाम ट्रीसेट

कब HashSetया TreeSetयहाँ उपयोग करना है इसकी विस्तृत चर्चा है: हैशसेट बनाम ट्रीसेट

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

विस्तृत चर्चा: ArrayList पर लिंक्डलिस्ट का उपयोग कब करें?


अच्छा! लेकिन मुझे आपके LinkedListबनाम ArrayListनिर्णयों से असहमत होना चाहिए । सबसे पहले, यदि सूची महत्वपूर्ण आकार की है, LinkedListबेहतर है। LinkedListप्रति-तत्व ओवरहेड है, इसलिए यह ए की तुलना में मेमोरी खपत के मामले में विषम है ArrayList। इसके अलावा, यदि अधिकांश पहुंच सूची के अंत में है, तो एक ArrayListबेहतर है क्योंकि यह निरंतर-समय यादृच्छिक तत्व पहुंच प्रदान करता है। के nतत्व को एक्सेस करना LinkedListएक O(n)ऑपरेशन है। ... वास्तव में, लिंक की गई सूची का उपयोग करने का निर्णय बहुत अधिक हमेशा "नहीं" होना चाहिए ।
मैट बॉल

2
@MattBall मैं आपके अधिकांश भाग के लिए सहमत हूं। हालाँकि, Java LinkedListएक डबल लिंक्ड लिस्ट है, इसलिए शुरुआत में और अंत में दोनों फास्ट होते हैं। आप ध्यान देंगे कि तीनों प्रश्नों से ऊपर की शाखाओं को हां में जवाब देना होगा, इससे पहले कि मैं इसका उपयोग करने की सलाह दूं LinkedList- इसलिए दूसरे शब्दों में मैं आपसे सहमत हूं कि ज्यादातर मामलों में जवाब नहीं है। सूची और क्षेत्र के सिरों से चीज़ें जहाँ आप लगातार जोड़ रहे हैं और हटा रहे हैं, जैसे चीजें आपके लिए अच्छा उपयोग-मामला है LinkedList
टिम बी

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

Map<K,V>का हिस्सा नहीं हैjava.util.collection
मेहराज मलिक

@ मेहराजमालिक हम्म, लेबलिंग अस्पष्ट है मैं सहमत हूँ। मेरा मतलब java.util के अंदर Collection है। अर्थात java.util। * यहां संग्रह नाम डालें *
टिम बी

66

प्रमुख गैर-समवर्ती, गैर-सिंक्रनाइज़ किए गए संग्रह का सारांश

Collection: वस्तुओं के एक अनियंत्रित "बैग" का प्रतिनिधित्व करने वाला एक इंटरफ़ेस, जिसे "तत्व" कहा जाता है। "अगला" तत्व अपरिभाषित (यादृच्छिक) है।

  • Set: Collectionकोई डुप्लिकेट के साथ एक इंटरफ़ेस का प्रतिनिधित्व करता है ।
    • HashSet: ए Setद्वारा समर्थित Hashtable। सबसे तेज़ और सबसे छोटी मेमोरी का उपयोग, जब ऑर्डर महत्वहीन होता है।
    • LinkedHashSet: सम्मिलन क्रमHashSet में तत्वों को जोड़ने के लिए एक लिंक की गई सूची के अलावा । "अगला" तत्व अगला-सबसे हाल ही में डाला गया तत्व है।
    • TreeSet: एक Setतत्व जहां एक Comparator(आमतौर पर प्राकृतिक आदेश ) द्वारा आदेश दिया जाता है । सबसे धीमी और सबसे बड़ी स्मृति उपयोग, लेकिन तुलनित्र-आधारित आदेश के लिए आवश्यक है।
    • EnumSet: एक बहुत तेज और कुशल Setएक एकल प्रकार के लिए अनुकूलित।
  • List: एक इंटरफेस Collectionजिसका तत्वों का आदेश दिया गया है और प्रत्येक के पास अपनी स्थिति का प्रतिनिधित्व करने वाला एक संख्यात्मक सूचकांक है, जहां शून्य पहला तत्व है, और (length - 1)अंतिम है।
    • ArrayList: एक Listसरणी द्वारा समर्थित, जहां सरणी की लंबाई ("क्षमता" कहा जाता है) जो कि तत्वों की संख्या (सूची के "आकार") से कम से कम बड़ी है। जब आकार क्षमता से अधिक हो जाता है (जब (capacity + 1)-thतत्व जोड़ा जाता है), तो सरणी को एक नई क्षमता के साथ फिर से बनाया (new length * 1.5)गया है - यह मनोरंजन का तेज है, क्योंकि यह उपयोग करता है System.arrayCopy()। तत्वों को हटाने और डालने / जोड़ने के लिए सभी पड़ोसी तत्वों (दाईं ओर) को उस स्थान में या बाहर स्थानांतरित करना होगा। किसी भी तत्व तक पहुंच तेज़ है, क्योंकि उसे केवल (element-zero-address + desired-index * element-size)स्थान खोजने के लिए गणना की आवश्यकता है । ज्यादातर स्थितियों में , ArrayLista को अधिक पसंद किया जाता है LinkedList
    • LinkedList: Listवस्तुओं का एक सेट द्वारा समर्थित, प्रत्येक अपने "पिछले" और "अगले" पड़ोसियों से जुड़ा हुआ है। एक LinkedListभी एक है Queueऔर Deque। एक्सेसिंग तत्वों को पहले या अंतिम तत्व से शुरू किया जाता है, और जब तक वांछित सूचकांक तक नहीं पहुंच जाता है तब तक ट्रैवर्सिंग होता है। सम्मिलन और विलोपन, एक बार जब वांछित सूचकांक ट्रैवर्सल के माध्यम से पहुंच जाता है, तो नए तत्व को इंगित करने या अब हटाए गए तत्व को बायपास करने के लिए केवल तत्काल-पड़ोसी लिंक को फिर से मैप करने का एक तुच्छ मामला है।
  • Map: एक इंटरफ़ेस Collectionजहाँ प्रत्येक तत्व की पहचान "कुंजी" होती है - प्रत्येक तत्व एक कुंजी-मूल्य युग्म है।
    • HashMap: ए Mapजहाँ चाबियाँ अनियंत्रित हैं, और ए द्वारा समर्थित है Hashtable
    • LinkedhashMap: प्रविष्टि क्रम द्वारा कुंजी का आदेश दिया जाता है
    • TreeMap: Mapजहाँ कुंजियाँ एक Comparator(आमतौर पर प्राकृतिक क्रम) द्वारा आदेशित होती हैं ।
  • Queue: एक इंटरफ़ेस जो Collectionतत्वों का प्रतिनिधित्व करता है , आम तौर पर, एक छोर से जोड़ा जाता है, और दूसरे से हटा दिया जाता है (FIFO: First-in, first-out)।
  • Stack: एक इंटरफ़ेस जो Collectionतत्वों का प्रतिनिधित्व करता है , आम तौर पर, दोनों को एक ही छोर से जोड़ा (धकेल दिया जाता है) और हटा दिया जाता है (LIFO: last-in, first-out)।
  • Deque: "डबल एंडेड कतार" के लिए लघु, आमतौर पर "डेक" का उच्चारण किया जाता है। एक लिंक की गई सूची जो आम तौर पर केवल (मध्य से नहीं) से जोड़ी जाती है और पढ़ी जाती है।

मूल संग्रह आरेख:

आरेख

एक साथ एक तत्व की प्रविष्टि की तुलना करना ArrayListऔर LinkedList:

आरेख


2
संक्षिप्त
गर्मियों

11

और भी सरल चित्र यहाँ है। जानबूझकर सरलीकृत!

  1. संग्रह कुछ भी है, जिसे "तत्व" (उसी प्रकार का) कहा जाता है। अधिक विशिष्ट कुछ भी नहीं माना जाता है।

  2. सूची डेटाका एक अनुक्रमित संग्रह है जहां प्रत्येक तत्व का एक सूचकांक है। सरणी की तरह कुछ है, लेकिन अधिक लचीला।

    सूची में डेटा प्रविष्टि का क्रम बनाए रखता है।

    विशिष्ट ऑपरेशन: एन-वें तत्व प्राप्त करें।

  3. सेट तत्वों का एक बैग है , प्रत्येक तत्व सिर्फ एक बार (तत्वों को उनकीequals()विधिका उपयोग करके प्रतिष्ठित कियाजाता है।

    सेट में डेटा ज्यादातर स्टोर किया जाता है ताकि पता चल सके कि डेटा क्या है

    विशिष्ट ऑपरेशन: यह बताएं कि क्या कोई तत्व सूची में मौजूद है।

  4. नक्शा सूची की तरह कुछ है, लेकिन उनके पूर्णांक सूचकांक द्वारा तत्वों तक पहुंचने के बजाय, आप उन्हें अपनी कुंजी द्वारा एक्सेस करते हैं, जो कि कोई भी वस्तु है। PHP में सरणी की तरह :)

    मानचित्र में डेटा उनकी कुंजी द्वारा खोजा जा सकता है।

    विशिष्ट संचालन: इसकी आईडी द्वारा एक तत्व प्राप्त करें (जहां आईडी किसी भी प्रकार की हो, न केवल intसूची के मामले में)।

भिन्नताएं

  • सेट और मैप: सेट में आप खुद से डेटा खोजते हैं , जबकि उनकी कुंजी द्वारा मैप में ।

  • सूची और मानचित्र: सूची में आप उनके intसूचकांक द्वारा तत्व तक पहुँचते हैं (सूची में स्थिति), उनकी कुंजी के अनुसार मानचित्र में किसी भी प्रकार का ओएस (आमतौर पर: आईडी)

  • सूची और सेट: सूची में तत्व अपनी स्थिति से बंधे होते हैं और डुप्लिकेट हो सकते हैं, जबकि सेट में तत्व केवल "वर्तमान" (वर्तमान में मौजूद नहीं हैं) और अद्वितीय हैं (के अर्थ में equals(), या के compareTo()लिए SortedSet)


1

यह सरल है: यदि आपको मैप इंटरफ़ेस के लिए मैप की गई चाबियों के साथ मानों को संग्रहीत करने की आवश्यकता है, अन्यथा उन मानों के लिए सूची का उपयोग करें जिन्हें डुप्लिकेट किया जा सकता है और अंत में सेट इंटरफ़ेस का उपयोग करें यदि आप अपने संग्रह में डुप्लिकेट किए गए मान नहीं चाहते हैं।

यहाँ पूरी व्याख्या http://javatutorial.net/choose-the-right-java-collection है , जिसमें फ्लोचार्ट आदि शामिल हैं।


1

नक्शा

यदि एक का चयन करते हुए Map, मैंने इस तालिका को जावा 11 के साथ बंडल किए गए दस कार्यान्वयनों में से प्रत्येक की विशेषताओं को संक्षेप में बनाया है।

जावा 11 में मानचित्र कार्यान्वयन की तालिका, उनकी विशेषताओं की तुलना करते हुए



-2

मुझे किस जावा संग्रह का उपयोग करना चाहिए?

यह इस बात पर निर्भर करता है कि आप किस समस्या को हल करने की कोशिश कर रहे हैं या आपको क्या आवश्यकताएं हैं।

उदाहरण :

  1. क्या आप चाहते हैं कि तत्वों का भंडारण करते समय उनकी छंटाई की जाए? HashSet
  2. क्या आप चाहते हैं (कुंजी, मान) जोड़े संग्रहीत किए जाएं? हैश मैप
  3. जब आप संरक्षित किए जाने के लिए तत्वों का क्रम चाहते हैं? ArrayList, लिंक्डलिस्ट
  4. क्या आप चाहते हैं कि कुंजी (कुंजी, मान) जोड़ी को क्रमबद्ध किया जाए? - मजबूत पाठ
  5. क्या आप अपनी समस्या को हल करने के लिए एक स्टैक को लागू करना चाहते हैं? - ढेर
  6. क्या आप FIFO (फर्स्ट इन फर्स्ट आउट) का उपयोग करना चाहते हैं? - कतार
  7. क्या आप केवल UNIQUE तत्वों को संग्रहीत करना चाहते हैं? - हैशसेट
  8. क्या आप भंडारण करते समय "नल" के रूप में कुंजी की अनुमति देना चाहते हैं (कुंजी, मूल्य)? - हैशपॉप
  9. क्या आप (कुंजी, मान) जोड़ी के लिए कोई पूर्ण मान नहीं चाहते हैं? हैश टेबल

यहां तक ​​कि आइटम 4 में मजबूत पाठ के साथ , कहते हैं, समवर्तीSkipListMap (K, V) , यह उत्तर टिम बी के निर्णय ग्राफ में , अल्पारी के "लघु-सूची विवरण" में क्या जोड़ता है ?
ग्रेबियर्ड

आपका पहला बिंदु, HashSet डेटा सॉर्ट नहीं करता है, यहां तक ​​कि सम्मिलन क्रम भी बनाए नहीं रखा गया है। आपको इसे ट्रीसेट
सौरभ मिश्र
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.