सवाल हैश मैप और हैशटेबल के बीच मतभेद?


ए के बीच मतभेद क्या हैं HashMap और ए Hashtable जावा में?

गैर थ्रेडेड अनुप्रयोगों के लिए कौन सा अधिक कुशल है?


3122
2017-09-02 20:12


मूल


हैशटेबल जावा 1.7 में अप्रचलित है और इसे ConcurrentMap कार्यान्वयन का उपयोग करने की अनुशंसा की जाती है - MissFiona


जवाब:


बीच में कई अंतर हैं HashMap तथा Hashtable जावा में:

  1. Hashtable है सिंक्रनाइज़, जहाँ तक HashMap नहीं है। यह बनाता है HashMap गैर-थ्रेडेड अनुप्रयोगों के लिए बेहतर, क्योंकि असीमित ऑब्जेक्ट आमतौर पर सिंक्रनाइज़ किए गए लोगों से बेहतर प्रदर्शन करते हैं।

  2. Hashtable अनुमति नहीं देता है null कुंजी या मूल्य। HashMap एक की अनुमति देता है null कुंजी और किसी भी संख्या में null मान।

  3. हैश मैप के उप-वर्गों में से एक है LinkedHashMap, इसलिए यदि आप पूर्वानुमानित पुनरावृत्ति आदेश चाहते हैं (जो डिफ़ॉल्ट रूप से सम्मिलन आदेश है), तो आप आसानी से स्वैप कर सकते हैं HashMap के लिए LinkedHashMap। यदि आप उपयोग कर रहे थे तो यह उतना आसान नहीं होगा Hashtable

चूंकि सिंक्रनाइज़ेशन आपके लिए कोई मुद्दा नहीं है, इसलिए मैं अनुशंसा करता हूं HashMap। अगर सिंक्रनाइज़ेशन एक मुद्दा बन जाता है, तो आप भी देख सकते हैं ConcurrentHashMap


3207
2017-09-02 23:02



यदि आप हैश मैप थ्रेड-सुरक्षित बनाना चाहते हैं, तो इसका उपयोग करें Collections.synchronizedMap()। - Rok Strniša
मैं यह भी टिप्पणी करूंगा कि थ्रेड-सुरक्षा में बेवकूफ दृष्टिकोण Hashtable ("हर विधि को सिंक्रनाइज़ करना किसी भी सहमति की समस्याओं का ख्याल रखना चाहिए!") इसे बहुत अधिक बनाता है और भी बुरा थ्रेडेड अनुप्रयोगों के लिए। आप बाहरी रूप से सिंक्रनाइज़ करने से बेहतर हैं HashMap(और परिणामों के बारे में सोच), या एक का उपयोग कर ConcurrentMap कार्यान्वयन (और समेकन के लिए अपने विस्तारित एपीआई का शोषण)। निचली पंक्ति: उपयोग करने का एकमात्र कारण Hashtable जब एक विरासत एपीआई (सीए 1 99 6 से) की आवश्यकता होती है। - erickson
हैश मैप प्रोग्रामर को थ्रेडसेफ कोड लिखने के लिए लचीलापन देता है जब वे वास्तव में इसका उपयोग करते हैं। यह शायद ही कभी हुआ कि मुझे एक थ्रेड सुरक्षित संग्रह की आवश्यकता है जैसे ConcurrentHashMap या हैशटेबल। मुझे जरूरी है कि सिंक्रनाइज़ ब्लॉक में फ़ंक्शंस या कुछ कथन का कुछ सेट थ्रेडसेफ हो। - Gaurava Agarwal
हैशटेबल अप्रचलित है और हम गैर थ्रेड सुरक्षित वातावरण के लिए हैश मैप का उपयोग कर रहे हैं। अगर आपको थ्रेड सुरक्षा की आवश्यकता है तो आप Collections.synchronizedMap () का उपयोग कर सकते हैं या ConcurrentHashMap का उपयोग कर सकते हैं जो हैशटेबल अधिक कुशल है। - Maneesh Kumar
यह अप्रचलित है लेकिन बहिष्कृत नहीं है और मैं सोच रहा हूं कि यह क्यों है। मैं इस वर्ग को हटाने का अनुमान लगा रहा हूं (और उसी कारण से वेक्टर) बहुत अधिक मौजूदा कोड तोड़ देगा और @ डेप्रेटेड के साथ टिप्पणी करने से कोड को हटाने का इरादा होगा, जो स्पष्ट रूप से वहां नहीं है। - Jilles van Gurp


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

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

एक समेकित सिंक्रनाइज़ हैश मैप द्वारा प्राप्त किया जा सकता है:

Collections.synchronizedMap(myMap);

लेकिन इस तर्क को सही ढंग से कार्यान्वित करने के लिए आपको चाहिए अतिरिक्त सिंक्रनाइज़ेशन फॉर्म का:

synchronized(myMap) {
    if (!myMap.containsKey("tomato"))
        myMap.put("tomato", "red");
}

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

के कार्यान्वयन ConcurrentMap इंटरफ़ेस (उदाहरण के लिए ConcurrentHashMap) इसमें से कुछ को हल करके हल करें धागा सुरक्षित चेक-फिर-कार्य अर्थशास्त्र जैसे कि:

ConcurrentMap.putIfAbsent(key, value);

583
2017-09-03 11:00



यह भी ध्यान रखें कि यदि हैश मैप संशोधित किया गया है, तो इसे इंगित करने वाले इटरेटर अमान्य प्रस्तुत किए जाते हैं। - Chris K
Iterator ConcurrentModificationException फेंक देगा, है ना? - Bhushan
तो थ्रेड सुरक्षित के संदर्भ में सिंक्रनाइज़ (myMap) {...} और ConcurrentHashMap के बीच कोई अंतर है? - telebog
बहुत सच है, मैंने यहां व्याख्या करने की कोशिश की ..lovehasija.com/2012/08/16/... - Love Hasija
@ बुशान: यह एक सर्वोत्तम प्रयास के आधार पर फेंक देगा, यह गारंटीकृत व्यवहार नहीं है: docs.oracle.com/javase/7/docs/api/java/util/HashMap.html - Matt Stephenson


Hashtable विरासत कोड माना जाता है। इसके बारे में कुछ भी नहीं है Hashtable इसका उपयोग नहीं किया जा सकता है HashMap या व्युत्पन्न HashMap, इसलिए नए कोड के लिए, मुझे वापस जाने के लिए कोई औचित्य नहीं दिख रहा है Hashtable


288
2018-06-25 01:46



हैशटेबल जावाडोक से (जोर जोड़ा गया): "जावा 2 प्लेटफार्म v1.2 के रूप में, इस वर्ग को मानचित्र इंटरफ़ेस को लागू करने के लिए पुनःप्रकाशित किया गया था, इसे जावा संग्रह फ्रेमवर्क का सदस्य बनाते हैं"हालांकि, आप सही हैं कि यह विरासत कोड है। सिंक्रनाइज़ेशन के सभी लाभ संग्रह। सिंक्रनाइज़ किए गए मैप (हैश मैप) के साथ अधिक कुशलता से प्राप्त किए जा सकते हैं। (वेक्टर के समान संग्रह। सिंक्रनाइज़लिस्ट लिस्ट (ऐरेलिस्ट) का विरासत संस्करण है।) - Kip
@ aberrant80: दुर्भाग्यवश आपके पास दोनों के बीच कोई विकल्प नहीं है और J2ME के ​​लिए प्रोग्रामिंग करते समय हैशटेबल का उपयोग करना होगा ... - pwes
यह उत्तर हटा दिया जाना चाहिए। इसमें गलत जानकारी है और इसमें बहुत सारे अपवॉट हैं। - anon58192932
@ anon58192932 क्या इसे ठीक करने के लिए प्रश्न को संपादित करना संभव है? - GC_
हमें पोस्टर @ aberrant80 या फ्लैगिंग द्वारा व्यवस्थापक का ध्यान रखना होगा। फ़्लैगिंग मदद कर सकती है - अब कोशिश करेंगी। - anon58192932


इस सवाल को साक्षात्कार में अक्सर पूछा जाता है कि क्या उम्मीदवार संग्रह कक्षाओं के सही उपयोग को समझता है और उपलब्ध वैकल्पिक समाधानों से अवगत है।

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

कुछ महत्वपूर्ण शर्तों पर ध्यान दें

  1. सिंक्रनाइज़ का मतलब है कि केवल एक धागा एक बिंदु पर हैश तालिका को संशोधित कर सकता है। असल में, इसका मतलब है कि हैशटेबल पर अपडेट करने से पहले किसी भी थ्रेड को ऑब्जेक्ट पर लॉक प्राप्त करना होगा जबकि अन्य लॉक को रिलीज़ होने की प्रतीक्षा करेंगे।
  2. विफल-सुरक्षित iterators के संदर्भ से प्रासंगिक है। यदि एक संग्रह वस्तु पर एक इटरेटर बनाया गया है और कुछ अन्य धागे संग्रह संरचना को "संरचनात्मक रूप से" संशोधित करने का प्रयास करते हैं, तो एक समवर्ती संशोधन अपवाद फेंक दिया जाएगा। हालांकि अन्य धागे के लिए "सेट" विधि का आह्वान करना संभव है क्योंकि यह संग्रह "संरचनात्मक रूप से" संशोधित नहीं करता है। हालांकि, अगर "सेट" को कॉल करने से पहले, संग्रह को संरचनात्मक रूप से संशोधित किया गया है, "अवैध अवैधकरण" फेंक दिया जाएगा।
  3. संरचनात्मक रूप से संशोधन तत्व को हटाने या डालने का मतलब है जो प्रभावी रूप से मानचित्र की संरचना को बदल सकता है।

हैश मैप द्वारा सिंक्रनाइज़ किया जा सकता है

Map m = Collections.synchronizeMap(hashMap);

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

नक्शा इंटरफेस


148
2017-10-04 06:39



इस उत्तर में कम से कम 2 महत्वपूर्ण तथ्यात्मक त्रुटियां हैं। यह निश्चित रूप से इस कई अपवर्तनीय के लायक नहीं है। - Stephen C
1) हैश मैप के इटरेटर असफल-सुरक्षित नहीं हैं। वे असफल हैं। उन दो शर्तों के बीच अर्थ में एक बड़ा अंतर है। 2) कोई नहीं है set ए पर ऑपरेशन HashMap। 3) द put(...) ऑपरेशन फेंक नहीं होगा IllegalArgumentException अगर कोई पिछला परिवर्तन था। 4) असफल-तेज व्यवहार HashMap  भी यदि आप मैपिंग बदलते हैं तो होता है। 5) असफल-तेज व्यवहार है गारंटी। (गारंटी नहीं है कि एक का व्यवहार है HashTableयदि आप एक समवर्ती संशोधन करते हैं। वास्तविक व्यवहार है ... अप्रत्याशित।) - Stephen C
6) Hashtable यह गारंटी नहीं देता है कि नक्शा तत्वों का क्रम समय के साथ स्थिर रहेगा। (आप शायद भ्रमित कर रहे हैं Hashtable साथ में LinkedHashMap।) - Stephen C
कोई और वास्तव में चिंतित है कि छात्रों को इन दिनों गलत विचार मिल रहा है कि संग्रह के "सिंक्रनाइज़ संस्करण" प्राप्त करने का अर्थ है कि आपको बाहरी परिसर परिचालन को सिंक्रनाइज़ करने की आवश्यकता नहीं है? इस का मेरा पसंदीदा उदाहरण है thing.set(thing.get() + 1); जो अक्सर पूरी तरह से असुरक्षित के रूप में आश्चर्य से आश्चर्यचकित नहीं होता है, खासकर अगर get() तथा set() सिंक्रनाइज़ तरीके हैं। उनमें से कई जादू की उम्मीद कर रहे हैं।
हैश मैप पर इटरेटर असफल नहीं हैं - Abdul


HashMap: के कार्यान्वयन Map इंटरफेस जो हैश कोड को सरणी के लिए उपयोग करता है। Hashtable: हाय, 1 99 8 को बुलाया गया। वे अपने संग्रह एपीआई वापस चाहते हैं।

गंभीरता से हालांकि, आप दूर रहने से बेहतर हैं Hashtable कुल मिलाकर। एकल-थ्रेडेड ऐप्स के लिए, आपको सिंक्रनाइज़ेशन के अतिरिक्त ओवरहेड की आवश्यकता नहीं है। अत्यधिक समवर्ती ऐप्स के लिए, परावर्तित सिंक्रनाइज़ेशन भुखमरी, डेडलॉक्स, या अनावश्यक कचरा संग्रहण विराम का कारण बन सकता है। टिम हाउलैंड की तरह बताया, आप इसका उपयोग कर सकते हैं ConcurrentHashMap बजाय।


107
2017-09-02 23:14



यह वास्तव में समझ में आता है। ConcurrentHashMaps आपको सिंक्रनाइज़ेशन की स्वतंत्रता देता है और डिबगिंग बहुत आसान है। - prap19


ध्यान रखें कि HashTable जावा कलेक्शन फ्रेमवर्क (जेसीएफ) पेश करने से पहले विरासत वर्ग था और बाद में इसे लागू करने के लिए फिर से लगाया गया था Map इंटरफेस। ऐसा ही था Vector तथा Stack

इसलिए, हमेशा नए कोड में उनसे दूर रहें क्योंकि हमेशा जेसीएफ में बेहतर विकल्प होता है जैसा कि दूसरों ने इंगित किया था।

यहाँ है जावा संग्रह धोखा शीट कि आप उपयोगी पाएंगे। ध्यान दें कि भूरे रंग के ब्लॉक में विरासत वर्ग हैशटेबल, वेक्टर और स्टैक शामिल है।

enter image description here


104
2018-03-25 08:58





Izb ने क्या कहा इसके अलावा, HashMap शून्य मूल्यों की अनुमति देता है, जबकि Hashtableनहीं करता।

यह भी ध्यान दें Hashtable विस्तार करता है Dictionary कक्षा, जो के रूप में javadocs राज्य, अप्रचलित है और इसे बदल दिया गया है Map इंटरफेस।


58
2017-09-02 20:30



लेकिन यह हैशटेबल अप्रचलित नहीं करता है? - Pacerier


इस चार्ट पर एक नजर डालें। यह हैश मैप और हैशटेबल के साथ विभिन्न डेटा संरचनाओं के बीच तुलना प्रदान करता है। तुलना सटीक, स्पष्ट और समझने में आसान है।

जावा संग्रह मैट्रिक्स


50
2017-11-20 05:35



धन्यवाद, अब मुझे पता है कि मेरे परिदृश्य में क्या चुनना है। - Well Smith


Hashtable के समान है HashMap और एक समान इंटरफ़ेस है। यह अनुशंसा की जाती है कि आप इसका उपयोग करें HashMap, जब तक आपको विरासत अनुप्रयोगों के लिए समर्थन की आवश्यकता न हो या आपको सिंक्रनाइज़ेशन की आवश्यकता हो, जैसा कि Hashtables तरीके सिंक्रनाइज़ हैं। तो आपके मामले में जब आप बहु-थ्रेडिंग नहीं हैं, HashMaps आपकी सबसे अच्छी शर्त है।


39
2017-09-02 20:25





हैशटेबल और हैशपैप के बीच एक और महत्वपूर्ण अंतर यह है कि हैश मैप में इटरेटर असफल हो रहा है जबकि हैशटेबल के लिए गणनाकर्ता नहीं है और अगर कोई अन्य थ्रेड इटरेटर की अपनी निकासी () विधि को छोड़कर किसी भी तत्व को जोड़कर या हटाकर संरचनात्मक रूप से मानचित्र को संशोधित करता है तो उसे समेकित किया जाता है। लेकिन यह गारंटीकृत व्यवहार नहीं है और सर्वोत्तम प्रयासों पर जेवीएम द्वारा किया जाएगा। "

मेरा स्रोत: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html


31
2017-09-08 06:40





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

HashMap तथा Hashtable दोनों स्टोर करने के लिए उपयोग किया जाता है कुंजी और मूल्य रूप में डेटा। दोनों अद्वितीय कुंजी स्टोर करने के लिए हैशिंग तकनीक का उपयोग कर रहे हैं। लेकिन नीचे दिए गए हैंश मैप और हैशटेबल कक्षाओं के बीच कई अंतर हैं।

हैश मैप 

1) HashMap गैर सिंक्रनाइज़ेड है। यह थ्रेड सुरक्षित नहीं है और उचित सिंक्रनाइज़ेशन कोड के बिना कई धागे के बीच साझा नहीं किया जा सकता है।
2) HashMap एक शून्य कुंजी और एकाधिक शून्य मानों की अनुमति देता है।
3) HashMap जेडीके 1.2 में पेश की गई एक नई कक्षा है।
4) HashMap तेज़ है।
5) हम कर सकते हैं HashMap इस कोड को कॉल करके सिंक्रनाइज़ किया गया है
Map m = Collections.synchronizedMap(HashMap);
6) HashMap Iterator द्वारा पीछा किया जाता है।
7) इटरेटर में HashMap असफल है
8) HashMap Ab सार मैप कक्षा विरासत में मिलता है।

हैश टेबल

1) Hashtable सिंक्रनाइज़ किया गया है। यह थ्रेड-सुरक्षित है और कई धागे के साथ साझा किया जा सकता है।
2) Hashtable किसी भी शून्य कुंजी या मूल्य की अनुमति नहीं है।
3) Hashtable एक विरासत वर्ग है।
4) Hashtable धीमा है।
5) Hashtable आंतरिक रूप से सिंक्रनाइज़ किया गया है और इसे सिंक्रनाइज़ नहीं किया जा सकता है।
6) Hashtable एन्यूमेरेटर और इटरेटर द्वारा पार किया जाता है।
7) में गणनाकर्ता Hashtable असफल नहीं है।
8) Hashtable विरासत शब्दकोश वर्ग।

आगे की पढाई जावा में हैश मैप और हैशटेबल के बीच क्या अंतर है?

enter image description here


31
2018-03-06 10:09



इस उत्तर में बहुत अधिक शामिल (डुप्लिकेट) - stackoverflow.com/a/39785829/432903। - prayagupd
आप क्यों कहते हैं ~ "हैशटेबल एक विरासत वर्ग है"? इसके लिए सहायक दस्तावेज कहां है। - Igor Ganapolsky
@ इगोरगानापोलस्की आप इसे पढ़ सकते हैं - stackoverflow.com/questions/21086307/... - roottraveller
हैश मैप को बनाए रखना ट्रीमैप से महंगा है। क्योंकि हैश मैप अनावश्यक अतिरिक्त बाल्टी बनाता है। - Abdul