CodeGym /Java Blog /এলোমেলো /জাভা হ্যাশটেবল
John Squirrels
লেভেল 41
San Francisco

জাভা হ্যাশটেবল

এলোমেলো দলে প্রকাশিত
জাভা হ্যাশটেবল ক্লাস জাভা সংগ্রহ ফ্রেমওয়ার্কের প্রাচীনতম সদস্যদের মধ্যে একটি। এটি গাণিতিক হ্যাশ টেবিল ডেটা কাঠামোর একটি বাস্তবায়ন। জাভা হ্যাশটেবলে অভ্যন্তরীণভাবে বালতি থাকে যেখানে কী/মান জোড়া সংরক্ষণ করা হয়। হ্যাশটেবল হ্যাশম্যাপের মতই । তাদের মধ্যে সবচেয়ে উল্লেখযোগ্য পার্থক্য: হ্যাশটেবল সিঙ্ক্রোনাইজ করা হয় যখন হ্যাশম্যাপ হয় না।

ডাটা স্ট্রাকচার হিসেবে হ্যাশটেবল

হ্যাশটেবল হল একটি ডেটা স্ট্রাকচার যেখানে ডেটা একটি অ্যারে ফরম্যাটে সংরক্ষণ করা হয়। প্রতিটি ডেটা মান একটি অনন্য কী মান আছে. কীটি জানা থাকলে, প্রয়োজনীয় ডেটাতে অ্যাক্সেস খুব দ্রুত। সুতরাং, সন্নিবেশ এবং অনুসন্ধান অপারেশনগুলি ডেটা আকারের উপর স্বাধীনভাবে দ্রুত হয়। হ্যাশ টেবিলে ডেটা রাখার জন্য একটি অ্যারে থাকে এবং একটি সূচক তৈরি করার জন্য হ্যাশিং করে যেখানে একটি উপাদান অবস্থিত হওয়া উচিত। হ্যাশিং কি? এটি একটি নিয়ম যা অবজেক্টকে অক্ষরের একটি সেটে (কোড) ম্যাপ করে। সাধারণত এই ধরনের ফাংশন ডেটার একটি বড় অংশকে একটি ছোট পূর্ণসংখ্যা মানের মধ্যে রূপান্তর করে। হ্যাশ ফাংশন ভিন্ন হতে পারে, কিন্তু তারা সব কিছু নির্দিষ্ট বৈশিষ্ট্য জমা দেয়:
  • একটি নির্দিষ্ট বস্তুর নির্দিষ্ট হ্যাশ কোড আছে।
  • দুটি সমান বস্তুর একই হ্যাশ কোড আছে। বিপরীত সত্য নয়।
  • দুটি হ্যাশ কোড ভিন্ন হলে, বস্তু অবশ্যই সমান নয়।
  • বিভিন্ন বস্তুর একই হ্যাশ কোড থাকতে পারে। এই অত্যন্ত বিরল ঘটনাটিকে সংঘর্ষ বলা হয়। ভালো হ্যাশ ফাংশন সংঘর্ষের সম্ভাবনা কমিয়ে দেয়।
একটি অবজেক্টে হ্যাশ ফাংশন প্রয়োগের ফলাফল হ্যাশকোডকে কল করে ।

জাভাতে হ্যাশটেবল

হ্যাশটেবল ক্লাস হল হ্যাশ টেবিল ডেটা স্ট্রাকচারের বাস্তবায়ন। এই সংগ্রহটি জাভা সংগ্রহ ফ্রেমওয়ার্কের আগে তৈরি করা হয়েছিল, কিন্তু পরে এটি অন্তর্ভুক্ত করা হয়েছিল। সমস্ত "প্রাথমিক" সংগ্রহের মতো (জাভা 1.0 থেকে), একটি হ্যাশটেবল সিঙ্ক্রোনাইজ করা হয় (প্রায় সব পদ্ধতিই সিঙ্ক্রোনাইজ হিসাবে চিহ্নিত)। এই ফ্যাক্টরের কারণে, হ্যাশটেবলে উল্লেখযোগ্য কর্মক্ষমতা সমস্যা রয়েছে। তাই, জাভা 1.2 থেকে শুরু করে, বেশিরভাগ ক্ষেত্রে সিঙ্ক্রোনাইজেশনের অভাবের কারণে মানচিত্র ইন্টারফেসের অন্যান্য বাস্তবায়ন ব্যবহার করার পরামর্শ দেওয়া হয়। সাধারণত হ্যাশম্যাপ সবচেয়ে উপযুক্ত প্রতিস্থাপন। তাই ক্লাস হ্যাশটেবল<K,V>কী এবং মান নিয়ে গঠিত। এটি হ্যাশিং নীতিতে কী সংরক্ষণ করে। কী-মানের জোড়া "বালতিতে" সংরক্ষণ করা হয়। বালতি একসাথে একটি "টেবিল", এক ধরনের অভ্যন্তরীণ অ্যারে তৈরি করে। Hashtable একটি বালতি নির্ধারণ করতে কী-এর হ্যাশকোড ব্যবহার করে যেখানে কী/মান জোড়া ম্যাপ করা উচিত। হ্যাশ ফাংশন কী এর হ্যাশকোড থেকে বালতি অবস্থান পেতে দেয়। এই ফাংশনটি একটি বস্তুর জন্য একটি পূর্ণসংখ্যা প্রদান করে। যেমনটি আমরা উপরে বলেছি দুটি সমান অবজেক্টের একই হ্যাশকোড রয়েছে, যখন দুটি অসম বস্তুর সবসময় আলাদা হ্যাশকোড নাও থাকতে পারে। হ্যাশটেবলে রাখা বিভিন্ন বস্তুর একই হ্যাশ কোড থাকতে পারে। এই সমস্যা সমাধানের জন্য (সংঘর্ষ) তালিকার অ্যারে হ্যাশটেবলে ব্যবহার করা হয়। একটি একক বালতিতে ম্যাপ করা জোড়াগুলি একটি তালিকায় সংরক্ষণ করা হয় এবং এই তালিকার রেফারেন্স অ্যারে সূচকে সংরক্ষণ করা হয়।

হ্যাশটেবল জাভা কনস্ট্রাক্টর

  • Hashtable() , ডিফল্ট কনস্ট্রাক্টর। এটি একটি খালি হ্যাশটেবল তৈরি করে। (ডিফল্ট প্রাথমিক ক্ষমতা = 11, লোড ফ্যাক্টর = 0.75)।
  • Hashtable(int size) নির্দিষ্ট আকারের একটি হ্যাশটেবল তৈরি করে।
  • হ্যাশটেবল (int সাইজ, ফ্লোট ফিল রেশিও) নির্দিষ্ট সাইজ এবং ফিল রেশিওর হ্যাশ টেবিল তৈরি করে।
  • Hashtable(Map 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.util প্যাকেজের ভিতরে রয়েছে । তাই আমদানি java.util.Hashtable ব্যবহার করুন; আপনার কোডে। সাধারণত আপনি এই সম্পর্কে আপনার IDE থেকে একটি ইঙ্গিত পাবেন।

হ্যাশটেবল প্রধান অপারেশন

হ্যাশটেবলের প্রধান ক্রিয়াকলাপগুলি সংগ্রহ করা, সংগ্রহে সন্নিবেশ করা এবং সেখান থেকে সরানো। এখানে এই তিনটি অপারেশন হল:
  • অবজেক্ট গেট (অবজেক্ট কী) নির্দিষ্ট কী আছে এমন অবজেক্টের মান প্রদান করে। এই ধরনের কোন কী পাওয়া না গেলে শূন্য দেয়।
  • অবজেক্ট পুট (অবজেক্ট কী, অবজেক্টের মান) নির্দিষ্ট কীকে নির্দিষ্ট মানের সাথে ম্যাপ করে। কী বা মান দুটিই শূন্য হতে পারে না।
  • অবজেক্ট রিমুভ (অবজেক্ট কী) হ্যাশটেবল থেকে এন্ট্রি (কী এবং সংশ্লিষ্ট মান) সরিয়ে দেয়।
অন্যান্য গুরুত্বপূর্ণ অপারেশন:
  • int size() হ্যাশ টেবিলে এন্ট্রির পরিমাণ প্রদান করে।
  • বুলিয়ান ধারণ করে(বস্তুর মান) পরীক্ষা করে যদি নির্দিষ্ট মান হ্যাশ টেবিলে থাকে। যদি তাই হয়, পদ্ধতি সত্য প্রদান করে, অন্যথায় মিথ্যা প্রদান করে।
  • বুলিয়ান containsValue(বস্তুর মান) পরীক্ষা করে যদি নির্দিষ্ট মান হ্যাশ টেবিলে থাকে। যদি তাই হয়, পদ্ধতি সত্য প্রদান করে, অন্যথায় মিথ্যা প্রদান করে।
  • void clear() হ্যাশটেবল থেকে সমস্ত এন্ট্রি সরিয়ে দেয়।
  • বুলিয়ান 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));
   }
}
এখানে জাভা হ্যাশটেবল উদাহরণ। স্টুডেন্ট ক্লাসের দুটি অবজেক্ট হ্যাশটেবলে রাখি , তারপর কিছু মুছে ফেলি এবং কিছু প্যারামিটার চেক করি।

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

হ্যাশম্যাপ বনাম হ্যাশটেবল

  • হ্যাশটেবল জাভাতে হ্যাশম্যাপের মতো। সবচেয়ে উল্লেখযোগ্য পার্থক্য হল হ্যাশটেবল সিঙ্ক্রোনাইজ করা হয় যখন হ্যাশম্যাপ হয় না। অতএব, সিঙ্ক্রোনাইজেশনের কারণে হ্যাশটেবল হ্যাশম্যাপের চেয়ে ধীর।
  • সিঙ্ক্রোনাইজেশন সমস্যা ব্যতীত, হ্যাশটেবল নালকে মান বা কী হিসাবে ব্যবহার করার অনুমতি দেয় না। হ্যাশম্যাপ একটি নাল কী এবং একাধিক নাল মান অনুমোদন করে।
  • হ্যাশটেবল ডিকশনারী ক্লাস ইনহেরিট করে যখন হ্যাশম্যাপ অ্যাবস্ট্রাক্টম্যাপ ক্লাস ইনহেরিট করে।
  • হ্যাশম্যাপ ইটারেটর দ্বারা অতিক্রম করা হয়। Hashtable শুধুমাত্র Iterator দ্বারা নয় গণনাকারী দ্বারাও অতিক্রম করা যেতে পারে।

জাভা হ্যাশটেবল উদাহরণ (হ্যাশটেবল বনাম হ্যাশম্যাপ নাল কী)

হ্যাশম্যাপ এবং হ্যাশটেবলে কী এবং মান হিসাবে ব্যবহৃত একটি নাল প্রদর্শনের জন্য এখানে একটি খণ্ড কোড রয়েছে

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