HashSet और HashMap के बीच अंतर?


168

इसके अलावा तथ्य यह है कि से HashSetडुप्लिकेट मानों की अनुमति नहीं है, के बीच अंतर क्या है HashMapऔर HashSet?

मेरा मतलब है कि कार्यान्वयन बुद्धिमान? यह थोड़ा अस्पष्ट है क्योंकि दोनों हैश तालिकाओं का उपयोग मूल्यों को संग्रहीत करने के लिए करते हैं।


HashSet को HashMap
therealprashant

मुझे लगता है कि यह जानकर कि हशसेट एरियर से अलग क्यों है, आपको अपने उपरोक्त प्रश्न के उत्तर को समझने में मदद मिलेगी: stackoverflow.com/questions/18706870/…
djangofan

जवाबों:


150

वे पूरी तरह से अलग निर्माण हैं। A HashMapका कार्यान्वयन है Map। मूल्यों के लिए एक मानचित्र मानचित्र कुंजी। हैश का उपयोग करके कुंजी दिखती है।

दूसरी ओर, एक HashSetका कार्यान्वयन है Set। एक सेट के गणितीय मॉडल से मेल खाने के लिए एक सेट बनाया गया है। A HashSetउपयोग करता है aHashMapजैसा कि आपने उल्लेख किया है अपने कार्यान्वयन को वापस करने के लिए । हालाँकि, यह एक पूरी तरह से अलग इंटरफ़ेस लागू करता है।

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


यह कथन थोड़ा सरल है। कवर के तहत कुछ और चल रहा है, "" निर्दिष्ट वस्तु के लिए हैश मान लौटाता है। ऑब्जेक्ट के स्वयं के हैशकोड के अलावा, यह विधि "पूरक हैश फ़ंक्शन" पर लागू होती है, जो खराब गुणवत्ता वाले हैश फ़ंक्शन के विरुद्ध है। यह महत्वपूर्ण है क्योंकि हैशपॉप में दो लंबाई वाली हैश टेबलों की शक्ति का उपयोग किया गया है। " weblogs.java.net/blog/2005/06/18/hashmap-implementation - हालांकि, यदि आप डॉक्टर को देखते हैं तो आप देखेंगे कि यह हैश चीजों को आवंटित करेगा ।" "बकेट" से अधिक है, तो अंत में मेरा मानना है कि दो चीजें एक ही बाल्टी मैप किया गया हो सकता है।
justkt

1
अपने दूसरे प्रश्न का उत्तर देने के लिए - नहीं। यदि आप चाहते हैं तो एक नक्शा (कुंजी -> मूल्य) @Bruno Rothgiesser के उत्कृष्ट उत्तर द्वारा परिभाषित किया गया है। एक सेट गैर-डुप्लिकेट तत्वों के लिए है। यदि आप डुप्लिकेट चाहते हैं और कुंजी नहीं-> मान, मैं एक java.util की जाँच करूँगा। कार्यान्वयन लागू करें। : एक निश्चित गाइड के लिए संग्रह ट्यूटोरियल देखें java.sun.com/docs/books/tutorial/collections/index.html
justkt

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

6
@SpikETidE: न तो HashMap और न ही HashSet डुप्लिकेट की अनुमति देते हैं। यह पूरी बात है।
माइकल बोर्गवर्ड

23
@SpikETidE: एक सेट में कुंजी / मान जोड़े नहीं होते हैं, केवल तत्व होते हैं। और हैशसेट को सेट तत्वों के साथ एक हाशप के रूप में कार्यान्वित किया जाता है और कुंजी को अनदेखा किया जा रहा है।
माइकल बोर्गवर्ड

300

हैशसेट एक सेट है , उदाहरण के लिए {1,2,3,4,5}

HashMap एक कुंजी है -> मूल्य ( मूल्य के लिए महत्वपूर्ण) नक्शा, जैसे {a -> 1, b -> 2, c -> 2, d -> 1}।

ऊपर मेरे उदाहरण में देखें कि हाशपैप में डुप्लिकेट कुंजियाँ नहीं होनी चाहिए, लेकिन इसमें डुप्लिकेट मान हो सकते हैं।

HashSet में, कोई डुप्लिकेट तत्व नहीं होना चाहिए।


लेकिन भ्रम का सबसे (सबसे दिलचस्प) कारण यह है कि हैशसेट में भी आपको तत्वों तक पहुंचने के लिए "कुंजी" की आवश्यकता होती है। यानी, ऑब्जेक्ट्स, यहां तक ​​कि गणित में, नाम (या पते) होते हैं, यदि वे एक्सेस या संदर्भित किए जाते हैं। इसलिए इस वास्तविक अर्थ में एक हैशसेट एक विशेष रूप से सरल हैशपॉप है, जो इसके तत्वों के नाम (या पते) के साथ है।
एंड्रयू मार्शल

65

HashSet

  1. HashSet वर्ग सेट इंटरफ़ेस लागू करता है
  2. हैशसेट में, हम वस्तुओं (तत्वों या मूल्यों) को संग्रहीत करते हैं जैसे अगर हमारे पास स्ट्रिंग तत्वों का एक हैशट है तो यह हैशसेट तत्वों के एक सेट को चित्रित कर सकता है: {"हैलो", "हाय", "बाय", "रन"}।
  3. HashSet डुप्लिकेट तत्वों की अनुमति नहीं देता है जिसका अर्थ है कि आप HashSet में डुप्लिकेट मान संग्रहीत नहीं कर सकते हैं।
  4. हैशसेट के पास एक शून्य मान होने की अनुमति है।
  5. हैशसेट सिंक्रनाइज़ नहीं है जिसका अर्थ है कि वे थ्रेड-सुरक्षित संचालन के लिए उपयुक्त नहीं हैं जब तक कि स्पष्ट रूप से सिंक्रनाइज़ नहीं किया जाता है। [समानता]

                          add      contains next     notes
    HashSet               O(1)     O(1)     O(h/n)   h is the table 

हैश मैप

  1. HashMap वर्ग मानचित्र इंटरफ़ेस को लागू करता है
  2. HashMap कुंजी और मूल्य जोड़े के भंडारण के लिए उपयोग किया जाता है। संक्षेप में, यह कुंजी और मान की मैपिंग को बनाए रखता है (हैशपॉप वर्ग लगभग हैशटेबल के बराबर है, सिवाय इसके कि यह असंतुष्ट है और नल की अनुमति देता है।) यह है कि आप हैशपेल तत्वों का प्रतिनिधित्व कैसे कर सकते हैं यदि यह पूर्णांक कुंजी और स्ट्रिंग प्रकार का मूल्य है: उदाहरण के लिए {1 -> "हैलो", 2 -> "हाय", 3 -> "बाय", 4 -> "रन"}
  3. हाशपैप डुप्लिकेट कुंजियों की अनुमति नहीं देता है लेकिन यह डुप्लिकेट मान रखने की अनुमति देता है।
  4. HashMap एकल नल कुंजी और शून्य मानों की किसी भी संख्या की अनुमति देता है।
  5. HashMap सिंक्रनाइज़ नहीं है जिसका अर्थ है कि वे थ्रेड-सुरक्षित संचालन के लिए उपयुक्त नहीं हैं जब तक कि स्पष्ट रूप से सिंक्रनाइज़ नहीं किया जाता है। [समानता]

                           get      containsKey next     Notes
     HashMap               O(1)     O(1)        O(h/n)   h is the table 

अधिक जानकारी पाने के लिए कृपया इस लेख को देखें।


36

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

उनके नामों से भ्रमित न हों; वे गहरी अलग चीजें हैं।


@HiteshSahu वे दोनों हैश टेबल्स ( en.wikipedia.org/wiki/Hash_table ) के साथ कार्यान्वित किए जाते हैं । यह एक सेट का प्रतिनिधित्व करने के लिए एक अच्छा डेटा संरचना है, जो सही मायनों में कुशल है, और, अनिवार्य रूप से, एक हैशट की कुंजी को हैशेट के रूप में कार्यान्वित किया जाता है। इसलिए जिसने भी उनका नाम लिया उन्हें लागू करने के लिए कुछ परेशानी हुई और उनके उद्देश्य (एक अनुमान पर) के बजाय कार्यान्वयन पर ध्यान केंद्रित किया गया।
कार्ल मैन्स्टर

1
अच्छी तरह समझाया। धन्यवाद।
user3932000

5

Hashsetआंतरिक रूप से लागू करता HashMap। यदि आप आंतरिक कार्यान्वयन देखते हैं तो हाशसेट में डाले गए मान हाशप में कुंजी के रूप में संग्रहीत किए जाते हैं और मान ऑब्जेक्ट क्लास का एक डमी ऑब्जेक्ट है।
हाशपेट बनाम हैशसेट के बीच अंतर है: -

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

3

HashSet हमें सेट में वस्तुओं को स्टोर करने की अनुमति देता है, जहां HashMap हमें कुंजी और मूल्य के आधार पर वस्तुओं को स्टोर करने की अनुमति देता है। हर वस्तु या संग्रहित वस्तु की कुंजी होगी।


2

जैसा कि नाम से पता चलता है, एक हैशपॉप एक सहयोगी मानचित्र है (एक कुंजी से मूल्य के लिए मैपिंग), एक हैशसेट सिर्फ एक सेट है


2
@SpikETidE यह विशिष्टता कैसे कार्यान्वित की जाती है इसका एक विवरण है, लेकिन हैशसेट का अर्थ एक सेट को लागू करना है।
माइकल बोर्गवर्ड 14

1
इसलिए .. यह सब "अगर आप डुप्लिकेट हैशसेट का उपयोग नहीं करना चाहते हैं" करने के लिए नीचे फोड़े ... यदि आप डुप्लिकेट उपयोग के बारे में परेशान नहीं करते हैं "HashMap" ....?
SpikETidE

3
जावा "संभावित डुप्लिकेट तत्वों के साथ संग्रह" (एक "बैग") के लिए एक विशिष्ट वर्ग को लागू नहीं करता है, आप इसके लिए एक सूची का उपयोग कर सकते हैं (हालांकि एक सूची बैग में कुछ शब्दार्थ जोड़ता है: आदेश; लेकिन आप इसे अनदेखा कर सकते हैं)।
leonbloy

2

जावा में HashSet और HashMap के बीच अंतर

1) हाशप और हैशसेट के बीच पहला और सबसे महत्वपूर्ण अंतर यह है कि हैशपॉट मैप इंटरफेस का एक कार्यान्वयन है जबकि हैशट सेट इंटरफेस का एक कार्यान्वयन है, जिसका अर्थ है कि हाशप एक महत्वपूर्ण मूल्य आधारित डेटा-संरचना है और हैशसेट डुप्लिकेट की अनुमति नहीं देकर विशिष्टता की गारंटी देता है। वास्तविकता हैशसेट जावा में हैशपॉप के चारों ओर एक आवरण है, यदि आप HashSet.java के ऐड (ई) विधि के कोड को देखते हैं, तो आप निम्नलिखित कोड देखेंगे:

public boolean add(E e) 
{
    return map.put(e, PRESENT)==null;
}

जहाँ इसकी वस्तु को मुख्य और मान के रूप में मानचित्र में रखा जाना एक अंतिम वस्तु है, जो डमी है।

2) हाशप और हैशसेट के बीच दूसरा अंतर यह है कि, हम तत्वों को सेट में डालने के लिए ऐड () विधि का उपयोग करते हैं, लेकिन हम जावा में हाशप में कुंजी और मान डालने के लिए पुट () विधि का उपयोग करते हैं।

3) हैशसेट केवल एक अशक्त कुंजी की अनुमति देता है, लेकिन हैशपेट एक अशक्त कुंजी + एकाधिक शून्य मानों की अनुमति दे सकता है।

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


2

जावा में HashSet और HashMap के बीच अंतर

HashSet आंतरिक रूप से HashMap का उपयोग ऑब्जेक्ट्स को स्टोर करने के लिए करता है। ऐड (String) पद्धति को इसे HahsMap put (की, वैल्यू) विधि कहा जाता है, जहां कुंजी = स्ट्रिंग ऑब्जेक्ट और वैल्यू = नई ऑब्जेक्ट (डमी)। इसके अलावा यह डुप्लिकेट बनाए रखता है क्योंकि कुंजियाँ मूल्य के अलावा कुछ भी नहीं हैं। वस्तु।

जिन वस्तुओं को हैशसेट / हैशपॉप में कुंजी के रूप में संग्रहीत किया जाता है उन्हें हैशकोड को ओवरराइड करना चाहिए और अनुबंध को बराबर करना चाहिए।

हशप में मूल्य वस्तुओं को एक्सेस / स्टोर करने के लिए उपयोग की जाने वाली कुंजी को अंतिम घोषित किया जाना चाहिए क्योंकि जब यह संशोधित किया जाता है तो ऑब्जेक्ट ऑब्जेक्ट स्थित नहीं हो सकता है और वापस लौट सकता है।


1

A HashMapको किसी भी प्रकार की कस्टम कुंजी द्वारा अनुक्रमित, प्राप्त करना, हटाना ... वस्तुओं को जोड़ना है।
HashSet तत्व है, निकालें तत्वों और जांच को जोड़ने के लिए है, तो तत्वों को उनके हैश की तुलना द्वारा उपस्थित हो रहा है।

तो एक HashMap में तत्व होते हैं और एक HashSet को उनकी हैश याद होती है।


1
उनकी हैश की तुलना करके और उनके equals()तरीकों को बुलाकर ।
लोर्ने

1

अंतर: पदानुक्रम के संबंध में: हैसेट सेट लागू होता है। हैशपॉप नक्शे को लागू करता है और कुंजी और मूल्यों के मानचित्रण को संग्रहीत करता है।

डेटाबेस के संबंध में HashSet और HashMap का उपयोग आपको प्रत्येक के महत्व को समझने में मदद करेगा।
हैशसेट: आम तौर पर अद्वितीय संग्रह वस्तुओं के भंडारण के लिए उपयोग किया जाता है। उदाहरण: इसका उपयोग
क्लास के आइटम और क्लास बिड के बीच कई-से-एक रिलेशनशिप शिप को स्टोर करने के लिए इम्प्लीमेंटेशन क्लास के रूप में किया जा सकता है, जहाँ (आइटम में कई बोलियाँ हैं) हाशप: का उपयोग मान की कुंजी के लिए किया जाता है। यह मान शून्य या कोई वस्तु हो सकती है / वस्तु की सूची (जो अपने आप में वस्तु है)।



0

एक HashSet आंतरिक रूप से अपनी प्रविष्टियों को संग्रहीत करने के लिए एक HashMap का उपयोग करता है। आंतरिक HashMap में प्रत्येक प्रविष्टि को एक एकल ऑब्जेक्ट द्वारा कुंजीबद्ध किया जाता है, इसलिए सभी प्रविष्टियां एक ही बाल्टी में हैश हो जाती हैं। मुझे याद नहीं है कि आंतरिक हैशपॉप अपने मूल्यों को संग्रहीत करने के लिए क्या उपयोग करता है, लेकिन यह वास्तव में कोई फर्क नहीं पड़ता क्योंकि आंतरिक कंटेनर में डुप्लिकेट मान कभी नहीं होंगे।

EDIT : मैथ्यू की टिप्पणी को संबोधित करने के लिए, वह सही है; मैं इसे पीछे की ओर था। आंतरिक HashMap सेट तत्वों को बनाने वाली वस्तुओं के साथ रखा गया है । हाशप के मूल्य एक ऐसी वस्तु है जो बस हाशप बाल्टी में संग्रहीत है।


यह सही नहीं है। सेट तत्वों को सीधे HashMap कुंजियों के रूप में उपयोग किया जाता है।
मैथ्यू फ्लैशेन

0

HashMapएक Mapकार्यान्वयन है, जो डुप्लिकेट मानों की अनुमति देता है लेकिन डुप्लिकेट कुंजियों का नहीं। । किसी ऑब्जेक्ट को जोड़ने के लिए एक कुंजी / मान युग्म आवश्यक है। नल कुंजी और अशक्त मान की अनुमति है। उदाहरण के लिए:

{मिलने वाली> 3, विश्व> 5, है-> 2, nice-> 4}

HashSetएक Setकार्यान्वयन है, जो डुप्लिकेट की अनुमति नहीं देता है । यदि आपने डुप्लिकेट ऑब्जेक्ट, public boolean add(Object o)विधि को कॉल करने की कोशिश की , तो सेट अपरिवर्तित रहता है और वापस आ जाता है false। उदाहरण के लिए:

[, दुनिया, है, अच्छा]


-1

आपने अपने स्वयं के प्रश्न का बहुत उत्तर दिया - हैशसेट डुप्लिकेट मानों की अनुमति नहीं देता है। यह एक बैकिंग हैशमैप का उपयोग करके एक हैशसेट बनाने के लिए तुच्छ होगा (और यह देखने के लिए कि क्या मूल्य पहले से मौजूद है)। मुझे लगता है कि विभिन्न जावा कार्यान्वयन या तो ऐसा करते हैं, या इसे अधिक कुशलता से करने के लिए कुछ कस्टम कोड लागू करते हैं।


1
@oedo - का java.util.HashSetकहना है कि एक द्वारा समर्थित है java.util.HashMap
justkt

2
डुप्लिकेट की अनुमति नहीं देना उनके बीच कोई अंतर नहीं है।
लोर्ने

-1

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


कुंजी है एक HashSet में मूल्य।
लोर्ने

-1

HashSet और HashMap दोनों जोड़े जोड़े रखते हैं, अंतर यह है कि HashMap में आप एक कुंजी निर्दिष्ट कर सकते हैं जबकि HashSet में कुंजी ऑब्जेक्ट के हैश कोड से आती है


अगर यह सच था, हैशसेट एक ही हैशकोड के साथ कई वस्तुओं को संग्रहीत नहीं कर सकता है, और यह करता है।
लोर्ने

-1

HashMapsएक शून्य कुंजी और शून्य मानों को अनुमति दें। वे सिंक्रनाइज़ नहीं हैं, जो दक्षता बढ़ाता है। यदि यह आवश्यक है, तो आप उन्हें उपयोग करके सिंक्रनाइज़ कर सकते हैंCollections.SynchronizedMap()

Hashtables अशक्त कुंजियों की अनुमति न दें और सिंक्रनाइज़ हैं।


उन्होंने हैशटेबल्स से घृणा नहीं की। सवाल का जवाब नहीं देता।
लोर्ने

-2

HashMap मानचित्र इंटरफ़ेस का एक कार्यान्वयन है HashSet सेट इंटरफ़ेस का कार्यान्वयन है

HashMap स्टोर केवल मुख्य ऑब्जेक्ट HashSet स्टोर ऑब्जेक्ट के रूप में डेटा संग्रहीत करता है

पुट विधि का उपयोग तत्व को मानचित्र में जोड़ने के लिए किया जाता है। तत्व को जोड़ने के लिए विधि का उपयोग किया जाता है

हैश मैप में हैशकोड वैल्यू को प्रमुख ऑब्जेक्ट का उपयोग करके गणना की जाती है। यहां हैशकोड वैल्यू की गणना के लिए सदस्य ऑब्जेक्ट का उपयोग किया जाता है जो दो ऑब्जेक्ट्स के लिए समान हो सकता है () विधि का उपयोग समानता के लिए जांच करने के लिए किया जाता है यदि यह गलत है कि दो ऑब्जेक्ट अलग हैं।

हैशपॉट हैशसेट की तुलना में तेज़ है क्योंकि ऑब्जेक्ट को एक्सेस करने के लिए अद्वितीय कुंजी का उपयोग किया जाता है, हैशमेट, हैशमैप की तुलना में धीमा है


1
उनके पास अनिवार्य रूप से समान प्रदर्शन है, और 'क्योंकि अद्वितीय कुंजी का उपयोग किया जाता है' गलत है।
लोर्ने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.