کلاس Java Hashtable یکی از قدیمی ترین اعضای Java Collection Framework است. این یک پیاده سازی از ساختار داده جدول هش ریاضی است. در جاوا hashtable به صورت داخلی حاوی سطل هایی است که جفت های کلید/مقدار در آن ذخیره می شوند. Hashtable تقریباً شبیه HashMap است . مهم ترین تفاوت بین آنها: Hashtable هماهنگ است در حالی که HashMap نیست.
Hashtable به عنوان یک ساختار داده
Hashtable یک ساختار داده است که در آن داده ها در قالب آرایه ذخیره می شوند. هر مقدار داده یک مقدار کلیدی منحصر به فرد دارد. اگر کلید شناخته شده باشد، دسترسی به داده های مورد نیاز بسیار سریع است. بنابراین، عملیات درج و جستجو به طور مستقل در اندازه داده سریع است. Hash Table از آرایه ای برای نگهداری داده ها و هش کردن برای تولید شاخصی تشکیل شده است که یک عنصر باید در آن قرار گیرد. هشینگ چیست؟ این یک قانون است که شی را به مجموعه ای از کاراکترها (کد) نگاشت می کند. معمولاً این نوع تابع یک قطعه بزرگ از داده را به یک مقدار صحیح کوچک تبدیل می کند. توابع هش می توانند متفاوت باشند، اما همه آنها ویژگی های خاصی را ارائه می دهند:- یک شی خاص دارای کد هش خاص است.
- دو شیء مساوی دارای کدهای هش یکسان هستند. عکس این قضیه درست نیست.
- اگر دو کد هش متفاوت باشند، قطعاً اشیاء برابر نیستند.
- ممکن است اشیاء مختلف کد هش یکسانی داشته باشند. این رویداد بسیار نادر برخورد نامیده می شود. تابع هش خوب احتمال برخورد را به حداقل می رساند.
قابلیت Hashtable در جاوا
کلاس Hashtable پیاده سازی ساختار داده جدول هش است. این مجموعه زودتر از Java Collection Framework ایجاد شد اما بعداً در آن گنجانده شد. مانند همه مجموعههای "اوایل" (از جاوا 1.0)، یک hashtable همگامسازی میشود (تقریباً همه روشها به عنوان همگام علامتگذاری شدهاند). به دلیل این عامل، hashtable مشکلات عملکرد قابل توجهی دارد. از این رو، با شروع از جاوا 1.2، در اکثر موارد استفاده از سایر پیاده سازی های رابط نقشه به دلیل عدم هماهنگی آنها توصیه می شود. معمولا HashMap مناسب ترین جایگزین است. بنابراین کلاس Hashtable<K,V> از کلیدها و مقادیر تشکیل شده است. این کلیدها را بر اساس اصل هش ذخیره می کند. جفت های کلید-مقدار در "سطل" ذخیره می شوند. سطل ها با هم یک "جدول"، نوعی آرایه داخلی می سازند. Hashtable از کد هش کلید برای تعیین سطلی استفاده می کند که جفت کلید/مقدار باید در آن نقشه برداری شود. تابع هش به شما امکان می دهد مکان سطل را از کد هش کلید دریافت کنید. این تابع یک عدد صحیح را برای یک شی برمی گرداند. همانطور که در بالا گفتیم دو شیء مساوی دارای کد هش یکسان هستند، در حالی که دو شیء نابرابر ممکن است همیشه دارای کدهای هش متفاوت نباشند. اشیاء مختلف، که در یک hashtable قرار می گیرند ممکن است دارای کد هش یکسانی باشند. برای حل این مشکل (برخورد) از آرایه ای از لیست ها در hashtable استفاده می شود. جفت هایی که در یک سطل نگاشت شده اند در یک لیست ذخیره می شوند و این مرجع فهرست در فهرست آرایه ذخیره می شود.سازندگان جاوا قابل هشت
- Hashtable() ، سازنده پیش فرض. یک hashtable خالی ایجاد می کند. (ظرفیت اولیه پیش فرض = 11، ضریب بار = 0.75).
- Hashtable(int size) یک hashtable با اندازه مشخص می سازد.
- Hashtable (اندازه int، float fillRatio) جدول هش با اندازه مشخص و نسبت پر را ایجاد می کند.
- Hashtable (Map m) یک hashtable با همان نگاشت نقشه داده شده ایجاد می کند.
اعلامیه قابل هشتم
کلاس Hashtable Java رابط های Map ، Cloneable و Serializable را پیاده سازی می کند . کلاس دیکشنری را گسترش می دهد .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 Hashtable داخل بسته java.util است. بنابراین از import java.util.Hashtable استفاده کنید. در کد شما معمولاً در این مورد از IDE خود راهنمایی دریافت می کنید.عملیات اصلی قابل هشت
عملیات اصلی Hashtable گرفتن، درج در مجموعه و حذف از آنجا است. در اینجا این سه عملیات عبارتند از:- Object get(Object key) مقدار Objectی را که کلید مشخص شده را برمی گرداند. در صورتی که چنین کلیدی پیدا نشود، پوچ برمیگرداند.
- Object put (کلید Object، Object value) کلید مشخص شده را به مقدار مشخص شده نگاشت می کند. نه کلید و نه مقدار نمی توانند null باشند.
- int size() مقدار ورودی های جدول هش را برمی گرداند.
- Boolean حاوی (Object value) بررسی می کند که آیا مقدار مشخص شده در جدول هش وجود دارد یا خیر. اگر چنین است، متد true را برمیگرداند، else false را برمیگرداند.
- Boolean containValue (مقدار Object) بررسی می کند که آیا مقدار مشخص شده در جدول هش وجود دارد یا خیر. اگر چنین است، متد true را برمیگرداند، else false را برمیگرداند.
- void clear() تمام ورودی ها را از hashtable حذف می کند.
- اگر کلید مشخصی در جدول هش وجود داشته باشد، containKey (کلید Object) boolean true را برمیگرداند، در غیر این صورت false را برگرداند.
- اگر hashtable خالی باشد یا اگر حاوی حداقل یک کلید باشد، boolean isEmpty () true را برمیگرداند.
- void rehash () اندازه hashtable را افزایش می دهد و همه کلیدهای آن را دوباره هش می کند.
اجرای جدول هش، کد جاوا:
بیایید یک کلاس دانشجویی ایجاد کنیم :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));
}
}
در اینجا نمونه ای از جاوا Hashtable است . بیایید دو Object از کلاس Student را در 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
HashMap در مقابل Hashtable
- Hashtable شبیه HashMap در جاوا است. مهم ترین تفاوت این است که Hashtable هماهنگ است در حالی که HashMap نیست. بنابراین، Hashtable به دلیل همگام سازی، کندتر از HashMap است.
- به جز مشکل همگام سازی، Hashtable اجازه نمی دهد null به عنوان یک مقدار یا کلید استفاده شود. HashMap به یک کلید تهی و چندین مقدار تهی اجازه می دهد.
- Hashtable کلاس Dictionary را به ارث می برد در حالی که HashMap کلاس AbstractMap را به ارث می برد.
- HashMap توسط Iterator عبور می کند. Hashtable نه تنها توسط Iterator بلکه توسط Enumerator قابل عبور است.
نمونه هشتشبل جاوا (کلید تهی Hashtable در مقابل HashMap)
در اینجا یک کد قطعه برای نشان دادن یک null است که به عنوان یک کلید و مقدار در HashMap و Hashtable استفاده می شود// 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
GO TO FULL VERSION