CodeGym /Java Blog /अनियमित /जावा हैशटेबल
John Squirrels
स्तर 41
San Francisco

जावा हैशटेबल

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

डेटा संरचना के रूप में हैशटेबल

हैशटेबल एक डेटा संरचना है जहां डेटा को सरणी प्रारूप में संग्रहीत किया जाता है। प्रत्येक डेटा मान का एक अद्वितीय कुंजी मान होता है। यदि कुंजी ज्ञात है, तो आवश्यक डेटा तक पहुँच बहुत तेज़ है। इसलिए, डेटा आकार पर स्वतंत्र रूप से प्रविष्टि और खोज संचालन तेजी से होते हैं। हैश टेबल में डेटा रखने के लिए एक सरणी होती है और एक इंडेक्स उत्पन्न करने के लिए हैशिंग होती है जहां एक तत्व स्थित होना चाहिए। हैशिंग क्या है? यह एक नियम है जो ऑब्जेक्ट को वर्णों (कोड) के सेट में मैप करता है। आम तौर पर इस प्रकार का फ़ंक्शन डेटा के एक बड़े टुकड़े को एक छोटे पूर्णांक मान में परिवर्तित करता है। हैश फ़ंक्शन भिन्न हो सकते हैं, लेकिन वे सभी कुछ गुण सबमिट करते हैं:
  • किसी विशेष वस्तु में विशेष हैश कोड होता है।
  • दो समान वस्तुओं में समान हैश कोड होते हैं। उलटा सच नहीं है।
  • यदि दो हैश कोड भिन्न हैं, तो वस्तुएँ निश्चित रूप से समान नहीं हैं।
  • अलग-अलग वस्तुओं में एक ही हैश कोड हो सकता है। यह अत्यंत दुर्लभ घटना टक्कर कहलाती है। अच्छा हैश फ़ंक्शन टकराव की संभावना को कम करता है।
ऑब्जेक्ट पर हैश फ़ंक्शन लागू करने का नतीजा हैशकोड कॉल करता है ।

जावा में हैशटेबल

हैशटेबल क्लास हैश टेबल डेटा स्ट्रक्चर का कार्यान्वयन है। यह संग्रह Java Collection Framework से पहले बनाया गया था, लेकिन बाद में इसमें शामिल किया गया था। सभी "प्रारंभिक" संग्रह (जावा 1.0 से) की तरह, एक हैशटेबल सिंक्रनाइज़ किया गया है (लगभग सभी विधियों को सिंक्रनाइज़ के रूप में चिह्नित किया गया है)। इस कारक के कारण, हैशटेबल में महत्वपूर्ण प्रदर्शन समस्याएँ हैं। इसलिए, जावा 1.2 से शुरू करते हुए, अधिकांश मामलों में उनके तुल्यकालन की कमी के कारण मानचित्र इंटरफ़ेस के अन्य कार्यान्वयनों का उपयोग करने की अनुशंसा की जाती है। आमतौर पर हैश मैप सबसे उपयुक्त प्रतिस्थापन है। तो क्लास हैशटेबल <के, वी>कुंजियों और मूल्यों से मिलकर बनता है। यह हैशिंग के सिद्धांत पर कुंजियों को संग्रहीत करता है। की-वैल्यू पेयर "बकेट" में स्टोर होते हैं। बाल्टियाँ मिलकर एक "तालिका" का निर्माण करती हैं, एक प्रकार की आंतरिक सरणी। हैशटेबल एक बकेट निर्धारित करने के लिए कुंजी के हैशकोड का उपयोग करता है जहां कुंजी / मान जोड़ी को मैप करना चाहिए। हैश फ़ंक्शन कुंजी के हैशकोड से बकेट स्थान प्राप्त करने देता है। यह फ़ंक्शन किसी ऑब्जेक्ट के लिए पूर्णांक संख्या देता है। जैसा कि हमने ऊपर कहा है कि दो समान वस्तुओं में एक ही हैशकोड होता है, जबकि दो असमान वस्तुओं में हमेशा अलग-अलग हैशकोड नहीं हो सकते हैं। हैशटेबल में डाली गई विभिन्न वस्तुओं में एक ही हैश कोड हो सकता है। इस समस्या (टक्कर) को हल करने के लिए हैशटेबल में सूचियों की सरणी का उपयोग किया जाता है। एकल बकेट में जोड़े गए जोड़े एक सूची में संग्रहीत किए जाते हैं और यह सूची संदर्भ सरणी अनुक्रमणिका में संग्रहीत होता है।

हैशटेबल जावा कंस्ट्रक्टर्स

  • हैशटेबल () , डिफ़ॉल्ट कंस्ट्रक्टर। यह एक खाली हैशटेबल बनाता है। (डिफ़ॉल्ट प्रारंभिक क्षमता = 11, लोड फैक्टर = 0.75)।
  • हैशटेबल (इंट साइज) निर्दिष्ट आकार के हैशटेबल का निर्माण करता है।
  • हैशटेबल (इंट साइज, फ्लोट फिलरेशियो) निर्दिष्ट आकार और भरण अनुपात की हैश तालिका बनाता है।
  • हैशटेबल (मैप एम) दिए गए मैप के समान मैपिंग के साथ हैशटेबल बनाता है।

हैशटेबल घोषणा

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

Hashtable.java
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable
K मानचित्र द्वारा अनुरक्षित कुंजियों का प्रकार है। V मैप किए गए मानों का प्रकार है। उदाहरण:

Hashtable<Student, Integer> myHTable = new Hashtable<>();

हैशटेबल कैसे आयात करें java

जावा हैशटेबल java.util पैकेज के अंदर है। तो आयात java.util.Hashtable का उपयोग करें; आपके कोड में। आमतौर पर आपको इस बारे में अपने IDE से हिंट मिलेगा।

हैशटेबल मुख्य संचालन

हैशटेबल का मुख्य संचालन संग्रह में प्रवेश करना और वहां से हटाना है। यहाँ ये तीन ऑपरेशन हैं:
  • ऑब्जेक्ट प्राप्त करें (ऑब्जेक्ट कुंजी) निर्दिष्ट कुंजी वाले ऑब्जेक्ट का मान लौटाता है। यदि ऐसी कोई कुंजी नहीं मिलती है तो शून्य हो जाता है।
  • ऑब्जेक्ट पुट (ऑब्जेक्ट कुंजी, ऑब्जेक्ट वैल्यू) निर्दिष्ट कुंजी को निर्दिष्ट मान पर मैप करता है। न तो कुंजी और न ही मान शून्य हो सकते हैं।
  • ऑब्जेक्ट रिमूव (ऑब्जेक्ट कुंजी) हैशटेबल से प्रविष्टि (कुंजी और संबंधित मान) को हटा देता है।
अन्य महत्वपूर्ण ऑपरेशन:
  • int size() हैश तालिका में प्रविष्टियों की मात्रा लौटाता है।
  • बूलियन सम्‍मिलित (ऑब्जेक्ट वैल्यू) चेक करता है कि निर्दिष्ट मान हैश तालिका में है या नहीं। यदि ऐसा है, तो मेथड ट्रू रिटर्न करता है, अन्यथा गलत रिटर्न देता है।
  • बूलियन सम्‍मिलित मान (ऑब्‍जेक्‍ट मान) जांचता है कि निर्दिष्ट मान हैश तालिका में है या नहीं। यदि ऐसा है, तो मेथड ट्रू रिटर्न करता है, अन्यथा गलत रिटर्न देता है।
  • शून्य स्पष्ट () हैशटेबल से सभी प्रविष्टियों को हटा देता है।
  • बूलियन सम्‍मिलित कुंजी (ऑब्जेक्ट कुंजी) सही लौटाता है यदि हैश तालिका में निर्दिष्ट कुंजी मौजूद है, अन्यथा झूठी वापसी करें।
  • बूलियन isEmpty() सही है अगर हैशटेबल खाली है या गलत है अगर इसमें कम से कम एक कुंजी है।
  • शून्य पुनर्वसन () हैशटेबल के आकार को बढ़ाता है और इसकी सभी चाबियों को पुन: साझा करता है।

हैश टेबल कार्यान्वयन, जावा कोड:

आइए एक छात्र वर्ग बनाएँ:

import java.util.Date;
public class Student {
   String surname;
   String name;
   String secondName;
   Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases

   public Student(String surname, String name, String secondName, Date birthday ){
       this.surname = surname;
       this.name = name;
       this.secondName = secondName;
       this.birthday = birthday == null ? 0 : birthday.getTime();
   }

   @Override
   public int hashCode(){
       //TODO: check for nulls
       return (surname + name + secondName + birthday).hashCode();
   }
   @Override
   public boolean equals(Object other_) {
       Student other = (Student)other_;
       return (surname == null || surname.equals(other.surname) )
               && (name == null || name.equals(other.name))
               && (secondName == null || secondName.equals(other.secondName))
               && (birthday == null || birthday.equals(other.birthday));
   }
}
यहाँ जावा हैशटेबल उदाहरण है। छात्र वर्ग की दो वस्तुओं को हैशटेबल में डालते हैं, फिर कुछ को हटाते हैं और कुछ मापदंडों की जांच करते हैं।

public class HashTableExample {
   public static void main(String[] args) {
 
       Hashtable<Student, Integer> myHTable = new Hashtable<>();
       Student sarah1 = new Student("Sarah","Connor", "Jane", null);
       Student john = new Student("John","Connor", "Kyle", new Date(1985, 02-1, 28)); // date not exists
       myHTable.put(john,1);
       myHTable.put(sarah1,0);
       System.out.println(myHTable.get(john));
       System.out.println(myHTable.isEmpty());
       System.out.println(myHTable.size());
       System.out.println(myHTable.contains(1));
       myHTable.remove(john);
       System.out.println(myHTable.contains(0));
       System.out.println(myHTable.contains(1));
       System.out.println(myHTable.containsKey(sarah1));
   }
}
चल रहे कार्यक्रम का परिणाम है:

1
false
2
true
true
false
true

हैश मैप बनाम हैशटेबल

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

जावा हैशटेबल उदाहरण (हैशटेबल बनाम हैश मैप नल कुंजी)

हैश मैप और हैशटेबल में कुंजी और मान के रूप में उपयोग किए जाने वाले शून्य को प्रदर्शित करने के लिए यहां एक टुकड़ा कोड है

// Null key Java hashtable example and hashmap example  

try{
      System.out.println("Hashtable");
      Hashtable hashTable = new Hashtable();
      hashTable.put(null, new Object());
    }catch(Exception ex){
      ex.printStackTrace();
    }
    System.out.println("HashMap");
    HashMap hashMap = new HashMap();
    hashMap.put(null, new Object());
    System.out.println("as you see no exceptions with null key in HashMap");
  }
इस खंड वाले प्रोग्राम को चलाने का परिणाम:

java.lang.NullPointerException
	at java.base/java.util.Hashtable.put(Hashtable.java:480)
	at Character.main(Character.java:58)
HashMap
as you see no exceptions with null key in HashMap

निष्कर्ष

आप वास्तव में वास्तविक परियोजनाओं में हैशटेबल का उपयोग नहीं करेंगे, लेकिन पुरानी परियोजनाओं में इस डेटा संरचना को पूरा करना आसान है। वैसे भी, यह समझना महत्वपूर्ण है कि जावा में डेटा स्ट्रक्चर्स क्या हैं और वे कैसे काम करते हैं, कम से कम आपके साक्षात्कारों के लिए। आमतौर पर हैशटेबल के बजाय हैश मैप ऑब्जेक्ट्स का उपयोग उनकी समानता के कारण किया जाता है। हैश मैप अधिक प्रभावी है (यह सिंक्रनाइज़ नहीं है) और एक कुंजी के रूप में शून्य हो सकता है।
टिप्पणियां
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION