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