2010-11-08 8 views
31

क्या हैश मैप में संग्रहीत की जाने वाली प्रमुख प्रविष्टियों की संख्या के लिए सैद्धांतिक सीमा है या क्या यह पूरी तरह ही ढेर मेमोरी पर निर्भर करता है?कुंजी (ऑब्जेक्ट्स) की संख्या के लिए सैद्धांतिक सीमा जिसे हैश मैप में संग्रहीत किया जा सकता है?

इसके अलावा, कौन सी डेटा संरचना बहुत बड़ी वस्तुओं को स्टोर करने के लिए सबसे अच्छी है (कई सौ हजार वस्तुएं कहें)?

+0

क्या आपके पास अनन्य कुंजी या प्रविष्टियों की संख्या के बारे में पूछना है? मैं शपथ ले सकता था हैश मैप बाल्टी के साथ बनाया गया था, इसलिए अधिकांश में Integer.MAX_VALUE बाल्टी हैं, उनमें से प्रत्येक में कई प्रविष्टियों के साथ एक सूची हो सकती है। – Phil

+3

दिलचस्प सवाल, मेरा +1 –

+1

प्राप्त करता है अलग-अलग लोगों के पास बड़े विचार हैं। क्या आप अधिक विशिष्ट हो सकते हैं, क्या आपका मतलब 100, 1000s, लाखों, लाखों, ट्रिलियन हैं? –

उत्तर

39

वहाँ कुंजी प्रविष्टियों की संख्या कि एक HashMap में संग्रहित किया जा सकता है या यह विशुद्ध रूप से उपलब्ध heapmemory पर निर्भर करता है के लिए एक सैद्धांतिक सीमा है?

the documentation of that class को देखते हुए, मैं कहूँगा कि सैद्धांतिक सीमा Integer.MAX_VALUE (2 -1 = 2147483647) तत्व है।

ऐसा इसलिए है क्योंकि इस वर्ग को सही तरीके से कार्यान्वित करने के लिए, size() विधि को int को कुंजी/मूल्य जोड़े की संख्या का प्रतिनिधित्व करने के लिए बाध्य किया जाता है।

HashMap.size()

रिटर्न के प्रलेखन से: इस नक्शे

नोट में मुख्य मान मैपिंग की संख्या: यह सवाल बहुत How many data a list can hold at the maximum के समान है।


जो डेटा संरचना सबसे अच्छा वस्तुओं की एक बहुत बड़ी संख्या में स्टोर करने के लिए है (कई सौ हजार वस्तुओं कहते हैं)?

मैं कहूंगा कि यह आपको स्टोर करने की आवश्यकता पर निर्भर करता है और आपको किस प्रकार की पहुंच की आवश्यकता है। संग्रह में निर्मित सभी शायद बड़ी मात्रा में अनुकूलित हैं।

+3

+1। – Bozho

+0

मैंने टिप्पणी नहीं पढ़ी, मुझे इस सीमा के बारे में पता नहीं था ... – pgras

+0

और मैंने अभी आकार(): int विधि :) – pgras

10

HashMap एक सरणी में मान रखता है, जो Integer.MAX_VALUE तक हो सकता है। लेकिन यह टकराव की गिनती नहीं करता है। प्रत्येक Entry में next फ़ील्ड है, जो एक प्रविष्टि भी है। इस तरह टकराव (एक ही हैशकोड के साथ दो या दो से अधिक वस्तुएं) हल हो जाती हैं। तो मैं यह नहीं कहूंगा किसी भी सीमा (उपलब्ध स्मृति से अलग)

ध्यान दें कि अगर आप Integer.MAX_VALUE से अधिक है, आप अनपेक्षित व्यवहार कुछ तरीकों से size() की तरह मिल जाएगा, है, लेकिन get() और put() अभी भी काम करेगा नहीं है। और वे काम करेंगे, क्योंकि किसी भी ऑब्जेक्ट के hashCode()int लौटाएंगे, इसलिए परिभाषा के अनुसार प्रत्येक ऑब्जेक्ट मानचित्र में फिट होगा। और फिर प्रत्येक वस्तु एक मौजूदा के साथ टक्कर लगी होगी।

+1

हैश मैप # आकार() का प्रलेखन वास्तव में कुंजी-मान मैपिंग की संख्या को int द्वारा प्रतिनिधित्व करने योग्य संख्या तक सीमित करता है। यदि कोई हैश मैप अधिक मैपिंग की अनुमति देगा, तो आकार() विधि का दस्तावेज मैप # आकार() से विरासत में मिला होगा, जो आकार> Integer.MAX_VALUE है, तो Integer.MAX_VALUE को वापस करने के लिए विधि को परिभाषित करता है। – jarnbjo

+0

'हैशकोड()' रिटर्न 'int'। इसलिए तालिका पूरी होने के बाद, केवल टकराव होंगे। आकार का उल्लेख करने के लिए – Bozho

0

मैं @ बोझो के साथ सहमत हूं और यह भी जोड़ दूंगा कि आपको Javadoc को हैश मैप पर ध्यान से पढ़ना चाहिए। ध्यान दें कि यह प्रारंभिक क्षमता और लोड कारक पर चर्चा कैसे करता है और वे हैश मैप के प्रदर्शन को कैसे प्रभावित करेंगे।

हैश मैप डेटा के बड़े सेट (जब तक आप चाबियाँ या मेमोरी से बाहर नहीं निकलते) के लिए पूरी तरह से ठीक है, लेकिन प्रदर्शन एक मुद्दा हो सकता है।

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

0

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

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