CodeGym /جاوا بلاگ /Random-UR /جاوا ہیش ٹیبل
John Squirrels
سطح
San Francisco

جاوا ہیش ٹیبل

گروپ میں شائع ہوا۔
جاوا ہیش ٹیبل کلاس جاوا کلیکشن فریم ورک کے قدیم ترین ممبروں میں سے ایک ہے۔ یہ ریاضیاتی ہیش ٹیبل ڈیٹا سٹرکچر کا نفاذ ہے۔ جاوا ہیش ٹیبل میں اندرونی طور پر ایسی بالٹیاں ہوتی ہیں جہاں کلید/ویلیو کے جوڑے محفوظ ہوتے ہیں۔ Hashtable کافی حد تک HashMap سے ملتا جلتا ہے ۔ ان کے درمیان سب سے اہم فرق: ہیش ٹیبل مطابقت پذیر ہے جبکہ ہیش میپ نہیں ہے۔

ڈیٹا ڈھانچے کے طور پر ہیش ٹیبل

ہیش ٹیبل ایک ڈیٹا ڈھانچہ ہے جہاں ڈیٹا کو ایک صف کی شکل میں محفوظ کیا جاتا ہے۔ ہر ڈیٹا ویلیو کی ایک منفرد کلیدی قدر ہوتی ہے۔ اگر کلید معلوم ہے تو، مطلوبہ ڈیٹا تک رسائی بہت تیز ہے۔ لہذا، ڈیٹا کے سائز پر اندراج اور تلاش کی کارروائیاں آزادانہ طور پر تیز ہوتی ہیں۔ ہیش ٹیبل ڈیٹا کو رکھنے کے لیے ایک سرنی پر مشتمل ہوتا ہے اور ایک انڈیکس کے لیے ہیشنگ کرتا ہے جہاں ایک عنصر واقع ہونا چاہیے۔ ہیشنگ کیا ہے؟ یہ ایک اصول ہے جو آبجیکٹ کو حروف کے ایک سیٹ (کوڈ) میں نقشہ بناتا ہے۔ عام طور پر اس قسم کا فنکشن ڈیٹا کے ایک بڑے ٹکڑے کو چھوٹی عددی قدر میں بدل دیتا ہے۔ ہیش کے افعال مختلف ہو سکتے ہیں، لیکن وہ سب کچھ خاص خصوصیات جمع کراتے ہیں:
  • ایک خاص آبجیکٹ میں مخصوص ہیش کوڈ ہوتا ہے۔
  • دو مساوی اشیاء میں ایک جیسے ہیش کوڈ ہیں۔ الٹا سچ نہیں ہے۔
  • اگر دو ہیش کوڈ مختلف ہیں تو، اشیاء یقینی طور پر برابر نہیں ہیں.
  • مختلف اشیاء میں ایک ہی ہیش کوڈ ہو سکتا ہے۔ اس انتہائی نایاب واقعے کو ٹکراؤ کہتے ہیں۔ اچھا ہیش فنکشن تصادم کے امکان کو کم کرتا ہے۔
کسی آبجیکٹ پر ہیش فنکشن لگانے کا نتیجہ hashCode کو کال کرتا ہے ۔

جاوا میں ہیش ٹیبل

ہیش ٹیبل کلاس ایک ہیش ٹیبل ڈیٹا سٹرکچر کا نفاذ ہے۔ یہ مجموعہ جاوا کلیکشن فریم ورک سے پہلے بنایا گیا تھا، لیکن بعد میں اس میں شامل کیا گیا۔ تمام "ابتدائی" مجموعوں کی طرح (جاوا 1.0 سے)، ایک ہیش ٹیبل مطابقت پذیر ہے (تقریباً تمام طریقوں کو ہم آہنگی کے طور پر نشان زد کیا گیا ہے)۔ اس عنصر کی وجہ سے، ہیش ٹیبل میں کارکردگی کے اہم مسائل ہیں۔ لہذا، جاوا 1.2 سے شروع کرتے ہوئے، زیادہ تر معاملات میں یہ تجویز کیا جاتا ہے کہ نقشہ انٹرفیس کے دیگر نفاذ کو ان کی مطابقت پذیری کی کمی کی وجہ سے استعمال کریں۔ عام طور پر HashMap سب سے مناسب متبادل ہے۔ لہذا کلاس ہیش ٹیبل<K,V> کلیدوں اور اقدار پر مشتمل ہے۔ یہ چابیاں ہیشنگ کے اصول پر محفوظ کرتا ہے۔ کلیدی قدر کے جوڑے "بالٹیوں" میں محفوظ کیے جاتے ہیں۔ بالٹیاں مل کر ایک "ٹیبل" بناتی ہیں، ایک قسم کی اندرونی صف۔ ہیش ٹیبل ایک بالٹی کا تعین کرنے کے لیے کلید کا ہیش کوڈ استعمال کرتا ہے جہاں کلید/قدر کے جوڑے کو نقشہ بنانا چاہیے۔ ہیش فنکشن کی کے ہیش کوڈ سے بالٹی لوکیشن حاصل کرنے دیتا ہے۔ یہ فنکشن کسی شے کے لیے ایک عدد عدد لوٹاتا ہے۔ جیسا کہ ہم نے اوپر کہا کہ دو مساوی اشیاء میں ایک ہی ہیش کوڈ ہوتا ہے، جبکہ دو غیر مساوی اشیاء میں ہمیشہ مختلف ہیش کوڈ نہیں ہوتے۔ ہیش ٹیبل میں ڈالی جانے والی مختلف اشیاء میں ایک ہی ہیش کوڈ ہو سکتا ہے۔ اس مسئلے کو حل کرنے کے لیے (تصادم) فہرستوں کی صفوں کو ہیش ٹیبل میں استعمال کیا جاتا ہے۔ ایک بالٹی میں میپ کیے گئے جوڑے ایک فہرست میں محفوظ کیے جاتے ہیں اور اس فہرست کا حوالہ سرنی انڈیکس میں محفوظ کیا جاتا ہے۔

ہیش ٹیبل جاوا کنسٹرکٹرز

  • Hashtable() ، ڈیفالٹ کنسٹرکٹر۔ یہ ایک خالی ہیش ٹیبل بناتا ہے۔ (پہلے سے طے شدہ ابتدائی صلاحیت = 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 Hashtable java.util پیکیج کے اندر ہے۔ تو امپورٹ java.util.Hashtable استعمال کریں؛ آپ کے کوڈ میں۔ عام طور پر آپ کو اپنے IDE سے اس بارے میں اشارہ ملے گا۔

ہیش ٹیبل مین آپریشنز

ہیش ٹیبل کے اہم کام حاصل کرنا، جمع کرنے میں داخل کرنا اور وہاں سے ہٹانا ہے۔ یہاں یہ تین آپریشن ہیں:
  • آبجیکٹ گیٹ (آبجیکٹ کلید) آبجیکٹ کی قدر لوٹاتا ہے جس نے کلید کی وضاحت کی ہے۔ ایسی کوئی کلید نہ ملنے پر null لوٹاتا ہے۔
  • آبجیکٹ ڈال (آبجیکٹ کی، آبجیکٹ ویلیو) مخصوص کلید کو مخصوص ویلیو سے نقشہ بناتا ہے۔ نہ تو کلید اور نہ ہی قدر کالعدم ہو سکتی ہے۔
  • آبجیکٹ ہٹانا (آبجیکٹ کی) ہیش ٹیبل سے اندراج (کلید اور متعلقہ قدر) کو ہٹاتا ہے۔
دیگر اہم آپریشنز:
  • int size() ہیش ٹیبل میں اندراجات کی مقدار واپس کرتا ہے۔
  • boolean پر مشتمل ہے (آبجیکٹ ویلیو) چیک کرتا ہے کہ آیا مخصوص ویلیو ہیش ٹیبل میں ہے۔ اگر ایسا ہے تو، طریقہ درست لوٹاتا ہے، ورنہ غلط لوٹاتا ہے۔
  • boolean containsValue(آبجیکٹ ویلیو) چیک کرتا ہے کہ آیا مخصوص ویلیو ہیش ٹیبل میں ہے۔ اگر ایسا ہے تو، طریقہ درست لوٹاتا ہے، ورنہ غلط لوٹاتا ہے۔
  • void clear() ہیش ٹیبل سے تمام اندراجات کو ہٹا دیتا ہے۔
  • boolean containsKey(آبجیکٹ کی) درست لوٹاتا ہے اگر مخصوص کلید ہیش ٹیبل میں موجود ہو، ورنہ غلط لوٹائیں۔
  • boolean 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 جاوا میں HashMap کی طرح ہے۔ سب سے اہم فرق یہ ہے کہ Hashtable مطابقت پذیر ہے جبکہ HashMap نہیں ہے۔ لہذا، ہیش ٹیبل مطابقت پذیری کی وجہ سے HashMap سے سست ہے۔
  • مطابقت پذیری کے مسئلے کے علاوہ، Hashtable null کو قدر یا کلید کے طور پر استعمال کرنے کی اجازت نہیں دیتا ہے۔ HashMap ایک null کلید اور متعدد null اقدار کی اجازت دیتا ہے۔
  • Hashtable کو ڈکشنری کلاس کا وراثت ملتا ہے جبکہ HashMap کو AbstractMap کلاس کا وارث ملتا ہے۔
  • HashMap کو Iterator کے ذریعے عبور کیا جاتا ہے۔ ہیش ٹیبل کو نہ صرف Iterator بلکہ شمار کنندہ کے ذریعے بھی عبور کیا جا سکتا ہے۔

جاوا ہیش ٹیبل مثال (Hashtable بمقابلہ HashMap null key)

HashMap اور Hashtable میں کلید اور قدر کے طور پر استعمال ہونے والے null کو ظاہر کرنے کے لیے یہاں ایک فریگمنٹ کوڈ ہے
// 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

نتیجہ

آپ واقعی اکثر اصلی پروجیکٹس میں ہیش ٹیبل کا استعمال نہیں کریں گے، لیکن پرانے پروجیکٹس میں اس ڈیٹا اسٹرکچر کو پورا کرنا آسان ہے۔ بہرحال، یہ سمجھنا ضروری ہے کہ جاوا کے ڈیٹا سٹرکچرز کیا ہیں اور وہ کیسے کام کرتے ہیں، کم از کم آپ کے انٹرویوز کے لیے۔ عام طور پر ہیش میپ آبجیکٹ ہیش ٹیبل کے بجائے ان کی مماثلت کی وجہ سے استعمال ہوتے ہیں۔ HashMap زیادہ موثر ہے (یہ مطابقت پذیر نہیں ہے) اور کلید کے طور پر null ہوسکتا ہے۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION