CodeGym /Java Blog /यादृच्छिक /जावा हॅशटेबल
John Squirrels
पातळी 41
San Francisco

जावा हॅशटेबल

यादृच्छिक या ग्रुपमध्ये प्रकाशित केले
Java Hashtable क्लास जावा कलेक्शन फ्रेमवर्कच्या सर्वात जुन्या सदस्यांपैकी एक आहे. हे गणितीय हॅश टेबल डेटा स्ट्रक्चरची अंमलबजावणी आहे. Java हॅशटेबलमध्ये आतील बाल्टी असतात जिथे की/व्हॅल्यू जोड्या संग्रहित केल्या जातात. हॅशटेबल हे हॅशमॅपसारखेच आहे . त्यांच्यातील सर्वात महत्त्वाचा फरक: हॅशटेबल सिंक्रोनाइझ केले जाते तर हॅशमॅप नाही.

डेटा स्ट्रक्चर म्हणून हॅशटेबल

हॅशटेबल एक डेटा संरचना आहे जिथे डेटा अॅरे स्वरूपात संग्रहित केला जातो. प्रत्येक डेटा मूल्य एक अद्वितीय की मूल्य आहे. की ज्ञात असल्यास, आवश्यक डेटामध्ये प्रवेश करणे खूप जलद आहे. तर, डेटा आकारावर इन्सर्शन आणि सर्च ऑपरेशन्स स्वतंत्रपणे वेगवान आहेत. हॅश टेबलमध्ये डेटा ठेवण्यासाठी अ‍ॅरे असतात आणि एक घटक जेथे असावा अशा निर्देशांक तयार करण्यासाठी हॅशिंग असते. हॅशिंग म्हणजे काय? हा एक नियम आहे जो ऑब्जेक्टला अक्षरांच्या संचामध्ये (कोड) मॅप करतो. सहसा अशा प्रकारचे फंक्शन डेटाच्या मोठ्या तुकड्याला लहान पूर्णांक मूल्यामध्ये रूपांतरित करते. हॅश फंक्शन्स भिन्न असू शकतात, परंतु ते सर्व काही विशिष्ट गुणधर्म सबमिट करतात:
  • विशिष्ट ऑब्जेक्टमध्ये विशिष्ट हॅश कोड असतो.
  • दोन समान ऑब्जेक्ट्समध्ये समान हॅश कोड असतात. उलट सत्य नाही.
  • दोन हॅश कोड भिन्न असल्यास, ऑब्जेक्ट्स निश्चितपणे समान नाहीत.
  • वेगवेगळ्या ऑब्जेक्ट्समध्ये समान हॅश कोड असू शकतो. या अत्यंत दुर्मिळ घटनेला टक्कर म्हणतात. चांगले हॅश फंक्शन टक्कर होण्याची शक्यता कमी करते.
ऑब्जेक्टवर हॅश फंक्शन लागू केल्याचा परिणाम हॅशकोडला कॉल करतो .

Java मध्ये हॅशटेबल

हॅशटेबल क्लास म्हणजे हॅश टेबल डेटा स्ट्रक्चरची अंमलबजावणी. हा संग्रह Java कलेक्शन फ्रेमवर्कच्या आधी तयार करण्यात आला होता, परंतु नंतर त्यात समाविष्ट करण्यात आला. सर्व "लवकर" संग्रहांप्रमाणे (जावा 1.0 वरून), हॅशटेबल सिंक्रोनाइझ केले जाते (जवळजवळ सर्व पद्धती समक्रमित म्हणून चिन्हांकित केल्या जातात). या घटकामुळे, हॅशटेबलमध्ये लक्षणीय कार्यप्रदर्शन समस्या आहेत. म्हणून, Java 1.2 पासून प्रारंभ करून, बहुतेक प्रकरणांमध्ये त्यांच्या समक्रमणाच्या अभावामुळे नकाशा इंटरफेसची इतर अंमलबजावणी वापरण्याची शिफारस केली जाते. सहसा हॅशमॅप सर्वात योग्य बदली आहे. म्हणून क्लास हॅशटेबल<K,V>की आणि मूल्यांचा समावेश आहे. हे हॅशिंगच्या तत्त्वावर की संग्रहित करते. की-व्हॅल्यू जोड्या "बकेट्स" मध्ये संग्रहित केल्या जातात. बादल्या मिळून एक "टेबल" बनवतात, एक प्रकारचा अंतर्गत अॅरे. हॅशटेबल किल्लीचा हॅशकोड वापरते बकेट कुठे की/मूल्याची जोडी मॅप करावी. हॅश फंक्शन कीच्या हॅशकोडवरून बकेट लोकेशन मिळवू देते. हे फंक्शन ऑब्जेक्टसाठी पूर्णांक संख्या देते. आम्ही वर म्हटल्याप्रमाणे दोन समान ऑब्जेक्ट्समध्ये समान हॅशकोड असतात, तर दोन असमान ऑब्जेक्ट्समध्ये नेहमी भिन्न हॅशकोड नसतात. हॅशटेबलमध्ये ठेवलेल्या वेगवेगळ्या ऑब्जेक्ट्समध्ये समान हॅश कोड असू शकतो. या समस्येचे निराकरण करण्यासाठी (टक्कर) हॅशटेबलमध्ये सूचीचा वापर केला जातो. एका बकेटमध्ये मॅप केलेल्या जोड्या सूचीमध्ये संग्रहित केल्या जातात आणि हा सूची संदर्भ अॅरे इंडेक्समध्ये संग्रहित केला जातो.

हॅशटेबल जावा कन्स्ट्रक्टर

  • हॅशटेबल() , डीफॉल्ट कन्स्ट्रक्टर. हे रिक्त हॅशटेबल तयार करते. (डिफॉल्ट प्रारंभिक क्षमता = 11, लोड घटक = 0.75).
  • हॅशटेबल (इंट आकार) निर्दिष्ट आकाराचे हॅशटेबल बनवते.
  • हॅशटेबल (इंट साइज, फ्लोट फिल रेशो) निर्दिष्ट आकार आणि फिल रेशोचे हॅश टेबल तयार करते.
  • हॅशटेबल(नकाशा m) दिलेल्या नकाशाप्रमाणेच मॅपिंगसह हॅशटेबल तयार करते.

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

हॅशटेबल जावा क्लास मॅप , क्लोन करण्यायोग्य आणि सीरियलाइज करण्यायोग्य इंटरफेस लागू करतो. हे डिक्शनरी क्लास वाढवते .

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 Hashtable java.util पॅकेजमध्ये आहे . म्हणून आयात java.util.Hashtable वापरा ; तुमच्या कोडमध्ये. सहसा तुम्हाला तुमच्या IDE कडून याबद्दल एक इशारा मिळेल.

हॅशटेबल मुख्य ऑपरेशन्स

हॅशटेबलचे मुख्य ऑपरेशन्स मिळवणे, संग्रहामध्ये समाविष्ट करणे आणि तेथून काढणे. येथे या तीन ऑपरेशन्स आहेत:
  • ऑब्जेक्ट गेट (ऑब्जेक्ट की) निर्दिष्ट की असलेल्या ऑब्जेक्टचे मूल्य परत करते. अशी कोणतीही कळ न मिळाल्यास शून्य परत करते.
  • ऑब्जेक्ट पुट (ऑब्जेक्ट की, ऑब्जेक्ट व्हॅल्यू) निर्दिष्ट की निर्दिष्ट मूल्यावर मॅप करते. की किंवा मूल्य शून्य असू शकत नाही.
  • ऑब्जेक्ट रिमूव्ह (ऑब्जेक्ट की) हॅशटेबलमधून एंट्री (की आणि संबंधित मूल्य) काढून टाकते.
इतर महत्वाचे ऑपरेशन्स:
  • int size() हॅश टेबलमधील नोंदींचे प्रमाण परत करते.
  • बूलियनमध्ये (ऑब्जेक्ट व्हॅल्यू) समाविष्ट आहे की निर्दिष्ट मूल्य हॅश टेबलमध्ये आहे का ते तपासते. तसे असल्यास, पद्धत सत्य मिळवते, अन्यथा खोटे परत करते.
  • boolean containsValue(ऑब्जेक्ट व्हॅल्यू) निर्दिष्ट मूल्य हॅश टेबलमध्ये आहे का ते तपासते. तसे असल्यास, पद्धत सत्य मिळवते, अन्यथा खोटे परत करते.
  • void clear() हॅशटेबलमधून सर्व नोंदी काढून टाकते.
  • हॅश टेबलमध्ये निर्दिष्ट की अस्तित्वात असल्यास boolean containsKey(ऑब्जेक्ट की) सत्य परत करते, अन्यथा खोटे परत करते.
  • बूलियन isEmpty() जर हॅशटेबल रिकामे असेल किंवा त्यात कमीत कमी एक की असेल तर खोटे दाखवते.
  • void rehash() हॅशटेबलचा आकार वाढवते आणि त्याच्या सर्व की पुन्हा हॅश करते.

हॅश टेबल अंमलबजावणी, जावा कोड:

चला विद्यार्थी वर्ग तयार करूया:

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));
   }
}
येथे Java Hashtable उदाहरण आहे. स्टुडंट क्लासचे दोन ऑब्जेक्ट हॅशटेबलमध्ये टाकू या , नंतर काही काढून टाका आणि काही पॅरामीटर्स तपासा.

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

हॅशमॅप वि हॅशटेबल

  • हॅशटेबल हे Java मधील हॅशमॅपसारखे आहे. सर्वात लक्षणीय फरक हा आहे की हॅशटेबल सिंक्रोनाइझ केले जाते तर हॅशमॅप नाही. त्यामुळे, हॅशटेबल सिंक्रोनाइझेशनमुळे हॅशमॅपपेक्षा हळू आहे.
  • सिंक्रोनाइझेशन समस्या वगळता, हॅशटेबल नल मूल्य किंवा की म्हणून वापरण्याची परवानगी देत ​​​​नाही. हॅशमॅप एक शून्य की आणि एकाधिक शून्य मूल्यांना अनुमती देते.
  • हॅशटेबलला डिक्शनरी क्लासचा वारसा मिळतो तर हॅशमॅपला अॅबस्ट्रॅक्ट मॅप क्लासचा वारसा मिळतो.
  • हॅशमॅप इटरेटरद्वारे ट्रॅव्हर्स केले जाते. हॅशटेबल केवळ इटरेटरद्वारेच नाही तर प्रगणकाद्वारे देखील पार केले जाऊ शकते.

जावा हॅशटेबल उदाहरण (हॅशटेबल वि हॅशमॅप शून्य की)

हॅशमॅप आणि हॅशटेबलमध्ये की आणि मूल्य म्हणून वापरलेले शून्य प्रदर्शित करण्यासाठी येथे एक तुकडा कोड आहे

// 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