java - हैश मैप और हैशटेबल के बीच मतभेद?
1. Hashmap
और Hashmap
दोनों स्टोर कुंजी और मूल्य।
2. Hashmap
एक कुंजी को null
रूप में स्टोर कर सकता है। Hashtable
संग्रहीत नहीं कर सकता null
।
3. HashMap
सिंक्रनाइज़ नहीं है लेकिन Hashtable
सिंक्रनाइज़ किया गया है।
4. के HashMap
साथ सिंक्रनाइज़ किया जा सकता हैCollection.SyncronizedMap(map)
Map hashmap = new HashMap();
Map map = Collections.SyncronizedMap(hashmap);
इस सवाल को साक्षात्कार में अक्सर पूछा जाता है कि क्या उम्मीदवार संग्रह कक्षाओं के सही उपयोग को समझता है और उपलब्ध वैकल्पिक समाधानों से अवगत है।
- हैश मैप क्लास लगभग हैशटेबल के बराबर है, सिवाय इसके कि यह सिंक्रनाइज़ नहीं है और नल की अनुमति देता है। (हैश मैप शून्य मूल्यों को कुंजी और मान के रूप में अनुमति देता है जबकि हैशटेबल नल की अनुमति नहीं देता है)।
- हैश मैप गारंटी नहीं देता है कि मानचित्र का क्रम समय के साथ स्थिर रहेगा।
- हैश मैप सिंक्रनाइज़ किया गया है जबकि हैशटेबल सिंक्रनाइज़ किया गया है।
- हैश मैप में इटरेटर असफल-सुरक्षित है, जबकि हैशटेबल के लिए गणनाकर्ता नहीं है और ConcurrentModificationException को फेंक देता है यदि कोई अन्य थ्रेड इटरेटर की अपनी निकासी () विधि को छोड़कर किसी भी तत्व को जोड़कर या हटाकर संरचनात्मक रूप से मानचित्र को संशोधित करता है। लेकिन यह गारंटीकृत व्यवहार नहीं है और सर्वोत्तम प्रयासों पर जेवीएम द्वारा किया जाएगा।
कुछ महत्वपूर्ण शर्तों पर ध्यान दें
- सिंक्रनाइज़ का मतलब है कि केवल एक धागा एक बिंदु पर हैश तालिका को संशोधित कर सकता है। असल में, इसका मतलब है कि हैशटेबल पर अपडेट करने से पहले किसी भी थ्रेड को ऑब्जेक्ट पर लॉक प्राप्त करना होगा जबकि अन्य लॉक को रिलीज़ होने की प्रतीक्षा करेंगे।
- विफल-सुरक्षित iterators के संदर्भ से प्रासंगिक है। यदि एक संग्रह वस्तु पर एक इटरेटर बनाया गया है और कुछ अन्य धागे संग्रह संरचना को "संरचनात्मक रूप से" संशोधित करने का प्रयास करते हैं, तो एक समवर्ती संशोधन अपवाद फेंक दिया जाएगा। हालांकि अन्य धागे के लिए "सेट" विधि का आह्वान करना संभव है क्योंकि यह संग्रह "संरचनात्मक रूप से" संशोधित नहीं करता है। हालांकि, अगर "सेट" को कॉल करने से पहले, संग्रह को संरचनात्मक रूप से संशोधित किया गया है, "अवैध अवैधकरण" फेंक दिया जाएगा।
- संरचनात्मक रूप से संशोधन तत्व को हटाने या डालने का मतलब है जो प्रभावी रूप से मानचित्र की संरचना को बदल सकता है।
हैश मैप द्वारा सिंक्रनाइज़ किया जा सकता है
Map m = Collections.synchronizeMap(hashMap);
नक्शा गणना वस्तुओं के माध्यम से पुनरावृत्ति के लिए प्रत्यक्ष समर्थन के बजाय संग्रह दृश्य प्रदान करता है। कलेक्शन व्यू इंटरफेस की अभिव्यक्ति को काफी बढ़ाते हैं, जैसा कि इस खंड में बाद में चर्चा की गई है। मानचित्र आपको कुंजी, मान, या कुंजी-मूल्य जोड़े पर पुन: सक्रिय करने की अनुमति देता है; हैशटेबल तीसरा विकल्प प्रदान नहीं करता है। मानचित्र पुनरावृत्ति के बीच में प्रविष्टियों को हटाने का एक सुरक्षित तरीका प्रदान करता है; हैशटेबल नहीं था। अंत में, मानचित्र हैशटेबल इंटरफ़ेस में मामूली कमी को हल करता है। हैशटेबल में एक विधि है जिसे शामिल किया गया है, जो हैशटेबल में दिया गया मान होने पर सत्य लौटाता है। इसके नाम को देखते हुए, यदि आप हैशटेबल में एक दी गई कुंजी निहित है, तो आप इस विधि को वापस लौटने की उम्मीद करेंगे, क्योंकि कुंजी हैशटेबल के लिए प्राथमिक पहुंच तंत्र है। नक्शा इंटरफ़ेस युक्त विधि का नाम बदलकर भ्रम के इस स्रोत को समाप्त करता है। इसके अलावा, यह इंटरफेस की स्थिरता में सुधार करता है - इसमें वैल्यू समांतर होते हैं।
जावा में HashMap
और Hashtable
बीच कई अंतर हैं:
Hashtable
synchronized , जबकिHashMap
नहीं है। यहHashMap
को गैर-थ्रेडेड अनुप्रयोगों के लिए बेहतर बनाता है, क्योंकि असीमित ऑब्जेक्ट आमतौर पर सिंक्रनाइज़ किए गए लोगों से बेहतर प्रदर्शन करते हैं।Hashtable
null
कुंजी या मानों की अनुमति नहीं देता है।HashMap
एकnull
कुंजी औरnull
संख्याओं की संख्या की अनुमति देता है।LinkedHashMap
के उप-वर्गों में से एकLinkedHashMap
, इसलिए यदि आप पूर्वानुमानित पुनरावृत्ति आदेश (जो डिफ़ॉल्ट रूप से प्रविष्टि आदेश है) चाहते हैं, तो आप आसानी से एकLinkedHashMap
लिएLinkedHashMap
को स्वैप कर सकते हैं। यदि आपHashtable
का उपयोग कर रहे थे तो यह उतना आसान नहीं होगा।
चूंकि सिंक्रनाइज़ेशन आपके लिए कोई मुद्दा नहीं है, इसलिए मैं HashMap
की अनुशंसा करता हूं। अगर सिंक्रनाइज़ेशन एक मुद्दा बन जाता है, तो आप ConcurrentHashMap
को भी देख सकते हैं।
ध्यान दें, कि बहुत सारे उत्तरों बताते हैं कि हैशटेबल सिंक्रनाइज़ है। अभ्यास में यह आपको बहुत कम खरीदता है। सिंक्रनाइज़ेशन एक्सेसर / म्यूटेटर विधियों पर समेकित रूप से नक्शे से जोड़ने या हटाने के दो धागे को रोक देगा, लेकिन असली दुनिया में आपको अक्सर अतिरिक्त सिंक्रनाइज़ेशन की आवश्यकता होगी।
एक बहुत ही आम मुहावरे "चेक करें" डालना है - यानी मानचित्र में एक प्रविष्टि की तलाश करें, और अगर यह पहले से मौजूद नहीं है तो इसे जोड़ें। यह किसी भी तरह पर परमाणु संचालन नहीं है चाहे आप हैशटेबल या हैश मैप का उपयोग करें।
एक समेकित सिंक्रनाइज़ हैश मैप द्वारा प्राप्त किया जा सकता है:
Collections.synchronizedMap(myMap);
लेकिन इस तर्क को सही ढंग से कार्यान्वित करने के लिए आपको फ़ॉर्म के अतिरिक्त सिंक्रनाइज़ेशन की आवश्यकता है:
synchronized(myMap) {
if (!myMap.containsKey("tomato"))
myMap.put("tomato", "red");
}
यहां तक कि हैशटेबल की प्रविष्टियों (या संग्रह। सिंक्रनाइज़मैप द्वारा प्राप्त एक हैशैप) पर भी पुनरावृत्ति करना थ्रेड सुरक्षित नहीं है जब तक कि आप अतिरिक्त सिंक्रनाइज़ेशन के माध्यम से मानचित्र को संशोधित करने से भी सुरक्षित न रखें।
ConcurrentMap इंटरफ़ेस के कार्यान्वयन (उदाहरण के लिए ConcurrentHashMap ) इनमें से कुछ को थ्रेड सुरक्षित चेक-अप-एक्ट सेमेन्टिक्स सहित हल करें जैसे कि:
ConcurrentMap.putIfAbsent(key, value);
ध्यान रखें कि जावा कलेक्शन फ्रेमवर्क (जेसीएफ) पेश करने से पहले HashTable
विरासत वर्ग था और बाद में Map
इंटरफ़ेस को लागू करने के लिए उसे फिर से लगाया गया था। तो Vector
और Stack
।
इसलिए, हमेशा नए कोड में उनसे दूर रहें क्योंकि जेसीएफ में हमेशा बेहतर विकल्प होता है क्योंकि अन्य ने बताया था।
यहां जावा संग्रह धोखा शीट है जो आपको उपयोगी लगेगी। ध्यान दें कि भूरे रंग के ब्लॉक में विरासत वर्ग हैशटेबल, वेक्टर और स्टैक शामिल है।
पहले से ही पोस्ट किया गया बहुत अच्छा जवाब है। मैं कुछ नए अंक जोड़ रहा हूं और इसे सारांशित कर रहा हूं।
HashMap
और Hashtable
दोनों का उपयोग कुंजी और मूल्य रूप में डेटा स्टोर करने के लिए किया जाता है। दोनों अद्वितीय कुंजी स्टोर करने के लिए हैशिंग तकनीक का उपयोग कर रहे हैं। लेकिन नीचे दिए गए हैंश मैप और हैशटेबल कक्षाओं के बीच कई अंतर हैं।
हैश मैप
-
HashMap
सिंक्रनाइज़ नहीं है। यह थ्रेड सुरक्षित नहीं है और उचित सिंक्रनाइज़ेशन कोड के बिना कई धागे के बीच साझा नहीं किया जा सकता है। -
HashMap
एक शून्य कुंजी और एकाधिक शून्य मानों की अनुमति देता है। -
HashMap
1.2 में पेश की गई एक नई कक्षा है। -
HashMap
तेज है। - हम इस कोड को कॉल करके
HashMap
को सिंक्रनाइज़ कर सकते हैं
Map m = Collections.synchronizedMap(HashMap);
-
HashMap
इटरेटर द्वारा पार किया जाता है। - हैश मैप में इटरेटर असफल है।
-
HashMap
Ab सारHashMap
कक्षा विरासत में मिलता है।
हैश टेबल
-
Hashtable
सिंक्रनाइज़ किया गया है। यह थ्रेड-सुरक्षित है और कई धागे के साथ साझा किया जा सकता है। -
Hashtable
किसी भी शून्य कुंजी या मूल्य की अनुमति नहीं देता है। -
Hashtable
एक विरासत वर्ग है। -
Hashtable
धीमा है। -
Hashtable
आंतरिक रूप से सिंक्रनाइज़ किया गया है और इसे सिंक्रनाइज़ नहीं किया जा सकता है। -
Hashtable
को एन्यूमेरेटर और इटरेटर द्वारा पार किया जाता है। - हैशटेबल में
Hashtable
विफल नहीं है। -
Hashtable
शब्दकोश कक्षा विरासत में मिलता है।
यहां वर्णित सभी अन्य महत्वपूर्ण पहलुओं के अलावा, जावा स्पेस में "नवीनतम और महानतम" जोड़ों के अनुरूप संग्रह एपीआई (जैसे मानचित्र इंटरफ़ेस) को हर समय संशोधित किया जा रहा है।
उदाहरण के लिए, जावा 5 मैप पुनरावृत्ति की तुलना करें:
for (Elem elem : map.keys()) {
elem.doSth();
}
पुराने हैशटेबल दृष्टिकोण बनाम:
for (Enumeration en = htable.keys(); en.hasMoreElements(); ) {
Elem elem = (Elem) en.nextElement();
elem.doSth();
}
जावा 1.8 में हमें अच्छी पुरानी पटकथा भाषाओं की तरह हैश मैप्स बनाने और एक्सेस करने में भी सक्षम होने का वादा किया गया है:
Map<String,Integer> map = { "orange" : 12, "apples" : 15 };
map["apples"];
अद्यतन: नहीं, वे 1.8 में नहीं उतरेंगे ... :(
हैशटेबल और हैशपैप के बीच एक और महत्वपूर्ण अंतर यह है कि हैश मैप में इटरेटर असफल हो रहा है जबकि हैशटेबल के लिए गणनाकर्ता नहीं है और अगर कोई अन्य थ्रेड इटरेटर की अपनी निकासी () विधि को छोड़कर किसी भी तत्व को जोड़कर या हटाकर संरचनात्मक रूप से मानचित्र को संशोधित करता है तो उसे समेकित किया जाता है। लेकिन यह गारंटीकृत व्यवहार नहीं है और सर्वोत्तम प्रयासों पर जेवीएम द्वारा किया जाएगा। "
मेरा स्रोत: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html
हैशटेबल सिंक्रनाइज़ किया गया है, जबकि हैश मैप नहीं है। इससे हैशमैप की तुलना में हैशटेबल धीमा हो जाता है।
गैर-थ्रेडेड ऐप्स के लिए, हैश मैप का उपयोग करें क्योंकि वे अन्यथा कार्यक्षमता के मामले में समान हैं।
here जानकारी के आधार पर, मैं हैश मैप के साथ जाने की अनुशंसा करता हूं। मुझे लगता है कि सबसे बड़ा फायदा यह है कि जावा इसे तब तक संशोधित करने से रोक देगा जब आप इसे फिर से चालू कर रहे हों, जब तक आप इसे पुनरावर्तक के माध्यम से नहीं करते।
HashMap
और Hashtable
में महत्वपूर्ण एल्गोरिदमिक अंतर भी हैं। इससे पहले किसी ने इसका उल्लेख नहीं किया है इसलिए मैं इसे ला रहा हूं। हैश HashMap
दो आकार की शक्ति के साथ एक हैश टेबल का निर्माण करेगा, इसे गतिशील रूप से बढ़ाएं कि आपके पास किसी भी बाल्टी में लगभग आठ तत्व (टकराव) हैं और तत्वों को सामान्य तत्व प्रकारों के लिए बहुत अच्छी तरह से हलचल करेंगे। हालांकि, Hashtable
कार्यान्वयन हैशिंग पर बेहतर और बेहतर नियंत्रण प्रदान करता है यदि आप जानते हैं कि आप क्या कर रहे हैं, अर्थात् आप टेबल आकार को अपने मूल्य डोमेन डोमेन आकार के निकटतम प्राइम नंबर का उपयोग कर ठीक कर सकते हैं और इसके परिणामस्वरूप हैश मैप यानी से बेहतर प्रदर्शन होगा कुछ मामलों के लिए टकराव।
इस प्रश्न में बड़े पैमाने पर चर्चा किए गए स्पष्ट मतभेदों से अलग, मैं हैशटेबल को "मैनुअल ड्राइव" कार के रूप में देखता हूं जहां हैशिंग और हैश मैप पर "स्वचालित ड्राइव" समकक्ष के रूप में आपका बेहतर नियंत्रण होता है जो आमतौर पर अच्छा प्रदर्शन करेगा।
Hashtable
के समान है और इसमें एक समान इंटरफ़ेस है। यह अनुशंसा की जाती है कि आप HashMap
उपयोग करें, जब तक आपको विरासत अनुप्रयोगों के लिए समर्थन की आवश्यकता न हो या आपको सिंक्रनाइज़ेशन की आवश्यकता हो, क्योंकि Hashtables
विधियां सिंक्रनाइज़ होती हैं। तो आपके मामले में जब आप बहु-थ्रेडिंग नहीं हैं, HashMaps
आपकी सर्वश्रेष्ठ शर्त है।
Hashtable
को विरासत कोड माना जाता है। Hashtable
बारे में कुछ भी नहीं है जो HashMap
या HashMap
व्युत्पन्न का उपयोग करके नहीं किया जा सकता है, इसलिए नए कोड के लिए, मुझे Hashtable
वापस जाने के लिए कोई औचित्य नहीं दिख रहा है।
Hashtable:
हैशटेबल एक डेटा संरचना है जो कुंजी-मूल्य जोड़ी के मानों को बरकरार रखती है। यह कुंजी और मूल्य दोनों के लिए शून्य की अनुमति नहीं देता है। NullPointerException
यदि आप शून्य मान जोड़ते हैं तो आपको एक मिल जाएगा । यह सिंक्रनाइज़ है। तो यह इसकी लागत के साथ आता है। केवल एक धागा किसी विशेष समय पर हैशटेबल तक पहुंच सकता है ।
उदाहरण :
import java.util.Map;
import java.util.Hashtable;
public class TestClass {
public static void main(String args[ ]) {
Map<Integer,String> states= new Hashtable<Integer,String>();
states.put(1, "INDIA");
states.put(2, "USA");
states.put(3, null); //will throw NullPointerEcxeption at runtime
System.out.println(states.get(1));
System.out.println(states.get(2));
// System.out.println(states.get(3));
}
}
हैश मैप:
HashMap की तरह है Hashtable लेकिन यह भी महत्वपूर्ण मूल्य जोड़ी स्वीकार करता है। यह कुंजी और मूल्य दोनों के लिए शून्य की अनुमति देता है। इसका प्रदर्शन बेहतर है HashTable
, क्योंकि यह है unsynchronized
।
उदाहरण:
import java.util.HashMap;
import java.util.Map;
public class TestClass {
public static void main(String args[ ]) {
Map<Integer,String> states = new HashMap<Integer,String>();
states.put(1, "INDIA");
states.put(2, "USA");
states.put(3, null); // Okay
states.put(null,"UK");
System.out.println(states.get(1));
System.out.println(states.get(2));
System.out.println(states.get(3));
}
}
सिंक्रनाइज़ेशन या थ्रेड सुरक्षित :
हैश मैप सिंक्रनाइज़ नहीं किया गया है, इसलिए यह सुरक्षित नहीं है और इसे उचित सिंक्रनाइज़ किए गए ब्लॉक के बिना एकाधिक धागे के बीच साझा नहीं किया जा सकता है, जबकि हैशटेबल सिंक्रनाइज़ किया गया है और इसलिए यह थ्रेड सुरक्षित है।
शून्य कुंजी और शून्य मान :
हैश मैप एक नल कुंजी और किसी भी संख्या के शून्य मानों की अनुमति देता है। हैशटेबल शून्य कुंजी या मानों की अनुमति नहीं देता है।
मूल्यों को बदलना :
हैश मैप में इटरेटर एक असफल-तेज़ इटरेटर है, जबकि हैशटेबल के लिए गणनाकर्ता नहीं है और ConcurrentModificationException को फेंक देता है यदि कोई अन्य थ्रेड इटरेटर की अपनी निकासी () विधि को छोड़कर किसी भी तत्व को जोड़कर या हटाकर संरचनात्मक रूप से मानचित्र को संशोधित करता है।
सुपरक्लास और विरासत :
हैश मैप सार सारणी वर्ग का उप-वर्ग है जबकि हैशटेबल शब्दकोश वर्ग का उप-वर्ग है।
प्रदर्शन :
हैश मैप सिंक्रनाइज़ नहीं है क्योंकि यह हैशटेबल की तुलना में तेज़ है।
उदाहरण के लिए http://modernpathshala.com/Article/1020/difference-between-hashmap-and-hashtable-in-java देखें और जावा संग्रह से संबंधित प्रश्नोत्तरी प्रश्न और प्रश्नोत्तरी
मेरा छोटा योगदान:
सबसे पहले और सबसे महत्वपूर्ण भिन्न है
Hashtable
औरHashMap
यह है कि थ्रेड-सुरक्षित संग्रहHashMap
नहीं है, जबकिHashtable
थ्रेड-सुरक्षित संग्रह है।के बीच दूसरा महत्वपूर्ण अंतर
Hashtable
औरHashMap
के बाद से, प्रदर्शन हैHashMap
यह तुलना में बेहतर प्रदर्शन सिंक्रनाइज़ नहीं कर रहा हैHashtable
।
Hashtable
बनाम पर तीसरा अंतरHashMap
यह है किHashtable
अप्रचलित वर्ग है और आपको जावाConcurrentHashMap
में जगह का उपयोग करना चाहिएHashtable
।
हैश मैप: - यह java.util पैकेज के अंदर उपलब्ध एक वर्ग है और इसका उपयोग तत्व को कुंजी और मूल्य प्रारूप में संग्रहीत करने के लिए किया जाता है।
हैशटेबल: - यह एक विरासत वर्ग है जिसे संग्रह ढांचे के अंदर पहचाना जा रहा है
हैशमैप्स आपको सिंक्रनाइज़ेशन की स्वतंत्रता देता है और डिबगिंग बहुत आसान है
1) हैशटेबल सिंक्रनाइज़ किया गया है जबकि हैशपैप नहीं है। 2) एक और अंतर यह है कि हैश मैप में इटरेटर विफल-सुरक्षित है जबकि हैशटेबल के लिए गणनाकर्ता नहीं है। यदि आप पुनरावृत्ति करते समय मानचित्र बदलते हैं, तो आपको पता चलेगा।
3) हैश मैप इसमें शून्य मानों को अनुमति देता है, जबकि हैशटेबल नहीं करता है।