जावा में हैशमैप और हैशटेबल को समझना
जावा संग्रह की दुनिया में, हैशमैप और हैशटेबल कुंजी-मूल्य जोड़े को संग्रहीत करने के लिए दो व्यापक रूप से उपयोग की जाने वाली डेटा संरचनाएं हैं। हालांकि वे समान लग सकते हैं, उनमें अलग-अलग अंतर हैं जो आपके एप्लिकेशन के प्रदर्शन और थ्रेड सुरक्षा को प्रभावित कर सकते हैं। अपनी आवश्यकताओं के लिए सही विकल्प चुनने के लिए इन अंतरों को समझना महत्वपूर्ण है।
यह आलेख हैशमैप और हैशटेबल के बीच प्रमुख अंतरों पर प्रकाश डालता है, गैर-थ्रेडेड अनुप्रयोगों के लिए उनकी कार्यक्षमता, दक्षता और उपयुक्तता की खोज करता है। अंत तक, आपके पास एक स्पष्ट विचार होगा कि आपके विशिष्ट उपयोग के मामले में किस डेटा संरचना का उपयोग करना है।
| आज्ञा | विवरण |
|---|---|
| HashMap.put() | HashMap में एक कुंजी-मान जोड़ी सम्मिलित करता है। शून्य कुंजियाँ और मानों की अनुमति देता है। |
| Hashtable.put() | हैशटेबल में एक कुंजी-मूल्य जोड़ी सम्मिलित करता है। शून्य कुंजियाँ या मानों की अनुमति नहीं देता. |
| System.nanoTime() | चल रहे जावा वर्चुअल मशीन के उच्च-रिज़ॉल्यूशन समय स्रोत का वर्तमान मान नैनोसेकंड में लौटाता है। |
| try { ... } catch (NullPointerException e) | कोड निष्पादित करने का प्रयास करता है और किसी भी NullPointerException को पकड़ता है, ऐसे मामलों को संभालता है जहां Hashtable.put() को शून्य मानों के साथ कॉल किया जाता है। |
| HashMap.get() | HashMap से निर्दिष्ट कुंजी से संबद्ध मान पुनर्प्राप्त करता है। |
| Hashtable.get() | हैशटेबल से निर्दिष्ट कुंजी से संबद्ध मान पुनर्प्राप्त करता है। |
हैशमैप और हैशटेबल कार्यान्वयन में गहराई से उतरें
पहली स्क्रिप्ट के बीच सीधी तुलना प्रदान करती है HashMap और Hashtable जावा में. स्क्रिप्ट आवश्यक कक्षाओं को आयात करने और दोनों डेटा संरचनाओं के उदाहरण बनाने से शुरू होती है। ए HashMap कुंजी-मूल्य जोड़े के साथ त्वरित और पॉप्युलेट किया गया है। इसी प्रकार, ए Hashtable बनाया और आबाद किया गया है। यह स्क्रिप्ट तब शून्य मानों को संभालने में मूलभूत अंतर प्रदर्शित करती है। HashMap.put() जबकि, बिना किसी समस्या के शून्य मान डालने की अनुमति देता है Hashtable.put() फेंकता है ए NullPointerException यदि शून्य कुंजियाँ या मान जोड़ने का प्रयास किया जाता है। try { ... } catch (NullPointerException e) इस व्यवहार को दर्शाने के लिए ब्लॉक का उपयोग किया जाता है। स्क्रिप्ट डेवलपर्स को यह समझने में मदद करती है कि इन दो डेटा संरचनाओं के बीच चयन करते समय शून्य मानों पर कब और क्यों विचार किया जाता है।
दूसरी स्क्रिप्ट प्रदर्शन परीक्षण पर केंद्रित है HashMap और Hashtable गैर-थ्रेडेड वातावरण में। यह दोनों मानचित्रों को प्रारंभ करने और उपयोग करके दस लाख कुंजी-मूल्य जोड़े डालने में लगने वाले समय को मापने से शुरू होता है System.nanoTime(). यह उच्च-रिज़ॉल्यूशन समय माप संचालन के लिए लिए गए सटीक समय को कैप्चर करने में मदद करता है। परिणाम कंसोल पर मुद्रित होते हैं, जो सापेक्ष प्रदर्शन दिखाते हैं। स्क्रिप्ट दोनों डेटा संरचनाओं से कुंजी के समान सेट के लिए पुनर्प्राप्ति समय को भी मापती है। इन समयों की तुलना करके, डेवलपर्स यह अनुमान लगा सकते हैं कि गैर-थ्रेडेड अनुप्रयोगों में कौन सी डेटा संरचना बेहतर प्रदर्शन करती है। यह स्क्रिप्ट प्रदर्शन ट्यूनिंग और इससे जुड़े ओवरहेड को समझने के लिए विशेष रूप से उपयोगी है Hashtable इसकी सिंक्रनाइज़ विधियों के कारण।
हैशमैप और हैशटेबल की तुलना: मुख्य अंतर और उपयोग के मामले
तुलना के लिए जावा कार्यान्वयन
import java.util.HashMap;import java.util.Hashtable;public class MapComparison {public static void main(String[] args) {// Creating a HashMapHashMap<String, String> hashMap = new HashMap<>();hashMap.put("1", "One");hashMap.put("2", "Two");hashMap.put("3", "Three");// Creating a HashtableHashtable<String, String> hashtable = new Hashtable<>();hashtable.put("A", "Apple");hashtable.put("B", "Banana");hashtable.put("C", "Cherry");// Displaying the HashMapSystem.out.println("HashMap: " + hashMap);// Displaying the HashtableSystem.out.println("Hashtable: " + hashtable);// Checking for null valuestry {hashMap.put(null, "NullValue");System.out.println("HashMap allows null values: " + hashMap);} catch (NullPointerException e) {System.out.println("HashMap does not allow null values");}try {hashtable.put(null, "NullValue");System.out.println("Hashtable allows null values: " + hashtable);} catch (NullPointerException e) {System.out.println("Hashtable does not allow null values");}}}
हैशमैप बनाम हैशटेबल: एकल-थ्रेडेड वातावरण में प्रदर्शन
गैर-थ्रेडेड अनुप्रयोगों के लिए जावा प्रदर्शन परीक्षण
import java.util.HashMap;import java.util.Hashtable;public class PerformanceTest {public static void main(String[] args) {// Initializing the mapsHashMap<Integer, Integer> hashMap = new HashMap<>();Hashtable<Integer, Integer> hashtable = new Hashtable<>();// Adding elements to HashMaplong startTime = System.nanoTime();for (int i = 0; i < 1000000; i++) {hashMap.put(i, i);}long endTime = System.nanoTime();System.out.println("HashMap time: " + (endTime - startTime) + " ns");// Adding elements to HashtablestartTime = System.nanoTime();for (int i = 0; i < 1000000; i++) {hashtable.put(i, i);}endTime = System.nanoTime();System.out.println("Hashtable time: " + (endTime - startTime) + " ns");// Retrieving elements from HashMapstartTime = System.nanoTime();for (int i = 0; i < 1000000; i++) {hashMap.get(i);}endTime = System.nanoTime();System.out.println("HashMap retrieval time: " + (endTime - startTime) + " ns");// Retrieving elements from HashtablestartTime = System.nanoTime();for (int i = 0; i < 1000000; i++) {hashtable.get(i);}endTime = System.nanoTime();System.out.println("Hashtable retrieval time: " + (endTime - startTime) + " ns");}}
हैशमैप और हैशटेबल: सिंक्रोनाइज़ेशन और थ्रेड सुरक्षा
के बीच प्रमुख अंतरों में से एक HashMap और Hashtable सिंक्रनाइज़ेशन और थ्रेड सुरक्षा के प्रति उनका दृष्टिकोण है। Hashtable सिंक्रनाइज़ है, जिसका अर्थ है कि यह थ्रेड-सुरक्षित है और समवर्ती समस्याओं के बिना कई थ्रेड्स के बीच साझा किया जा सकता है। यह सिंक्रनाइज़ेशन इसके अधिकांश तरीकों को सिंक्रनाइज़ करके प्राप्त किया जाता है, जो यह सुनिश्चित करता है कि किसी भी समय केवल एक थ्रेड हैशटेबल तक पहुंच सकता है। हालाँकि, यह लॉकिंग तंत्र के कारण एक प्रदर्शन ओवरहेड का भी परिचय देता है Hashtable की तुलना में धीमी HashMap एकल-थ्रेडेड परिदृश्यों में।
इसके विपरीत, HashMap सिंक्रनाइज़ नहीं है और इसलिए थ्रेड-सुरक्षित नहीं है। यदि एक HashMap एक साथ कई थ्रेड्स द्वारा एक्सेस किया जाता है, तो डेटा असंगतता और दौड़ की स्थिति का खतरा होता है। एक बनाने के लिए HashMap थ्रेड-सुरक्षित, डेवलपर्स उपयोग कर सकते हैं Collections.synchronizedMap() इसे एक सिंक्रनाइज़ मानचित्र में लपेटने के लिए, या वे इसका उपयोग कर सकते हैं ConcurrentHashMap क्लास को जावा 1.5 में पेश किया गया है, जो मानचित्र के विभिन्न हिस्सों तक समवर्ती पहुंच की अनुमति देकर बेहतर प्रदर्शन प्रदान करता है। यह बनाता है ConcurrentHashMap समवर्ती अनुप्रयोगों के लिए एक अधिक कुशल विकल्प।
हैशमैप और हैशटेबल के बारे में अक्सर पूछे जाने वाले प्रश्न
- हैशमैप और हैशटेबल के बीच मुख्य अंतर क्या है?
- HashMap सिंक्रनाइज़ नहीं है और अशक्त कुंजियों और मानों की अनुमति देता है, जबकि Hashtable सिंक्रनाइज़ है और शून्य कुंजियों या मानों की अनुमति नहीं देता है।
- एकल-थ्रेडेड वातावरण में कौन सा तेज़ है?
- HashMap सिंक्रोनाइज़ेशन ओवरहेड की कमी के कारण एकल-थ्रेडेड वातावरण में आम तौर पर तेज़ होता है।
- आप हैशमैप थ्रेड-सुरक्षित कैसे बना सकते हैं?
- का उपयोग करके Collections.synchronizedMap() लपेटने के लिए HashMap या उपयोग करके ConcurrentHashMap.
- क्या हैशटेबल शून्य कुंजियाँ या मान संग्रहीत कर सकता है?
- नहीं, Hashtable शून्य कुंजी या मानों की अनुमति नहीं देता है और फेंक देगा NullPointerException यदि प्रयास किया गया.
- आपको HashMap पर Hashtable का उपयोग कब करना चाहिए?
- उपयोग Hashtable जब थ्रेड सुरक्षा की आवश्यकता होती है और आप सिंक्रोनाइज़ेशन के प्रदर्शन ओवरहेड के बारे में चिंतित नहीं होते हैं।
- क्या ConcurrentHashMap हैशटेबल का बेहतर विकल्प है?
- हाँ, ConcurrentHashMap की तुलना में बेहतर समवर्तीता और प्रदर्शन प्रदान करता है Hashtable.
- हैशमैप थ्रेड-सुरक्षित क्यों नहीं है?
- HashMap एकल-थ्रेडेड परिदृश्यों के लिए डिज़ाइन किया गया है और इसमें सिंक्रनाइज़ेशन तंत्र शामिल नहीं है।
- हैशमैप और हैशटेबल टकराव को कैसे संभालते हैं?
- दोनों HashMap और Hashtable चेनिंग का उपयोग करके टकरावों को संभालें, जहां प्रत्येक बाल्टी में प्रविष्टियों की एक लिंक की गई सूची होती है।
हैशमैप और हैशटेबल पर अंतिम विचार
हैशमैप और हैशटेबल कुंजी-मूल्य जोड़े को संग्रहीत करने में समान उद्देश्यों को पूरा करते हैं लेकिन सिंक्रनाइज़ेशन और प्रदर्शन के लिए उनके दृष्टिकोण में काफी भिन्नता है। HashMap को इसकी गति और शून्य मानों के साथ लचीलेपन के कारण गैर-थ्रेडेड अनुप्रयोगों के लिए प्राथमिकता दी जाती है। इसके विपरीत, हैशटेबल थ्रेड-सुरक्षित संचालन के लिए उपयुक्त है लेकिन प्रदर्शन की कीमत पर। इन अंतरों को समझकर, डेवलपर्स अपनी विशिष्ट आवश्यकताओं के आधार पर किस डेटा संरचना का उपयोग करना है, इस पर सूचित निर्णय ले सकते हैं।