Hashtable

کلاس Hashtable زیر کلاس Dictionary است و از interface های Map و Clonable و Serializable ارث بری می کند. همانند HashMap این کلاس نیز برای نگه داری زوج کلید-مقدار به کار می رود ، همانطور که از نام آن پیداست این کلاس نیز همچون کلاس HashMap از الگوریتم درهم سازی برای نگه داری زوج های کلید-مقدار استفاده می کند. برخی از تفاوت های Hashtable و HashMap عبارتند از :

  • در Hashtable مجاز به استفاده از کلید یا مقدار null نیستیم ولی در HashMap چنین محدودیتی وجود ندارد.
  • Hashtable کلاسی سنکرون شده (synchronized) و در نتیجه Thread-safe است ولی HashMap نیست.
  • در برنامه ها معمولی که چند ریسمانی نیستند HashMap سریع تر است.

کلاس Hashtable از طریق مسیر java.util.Hashtable قابل دستیابی است. برای ساخت یک شی جدید از این کلاس می توانیم از یکی از سازنده های زیر استفاده کنیم :

Hashtable()

یک Hashtable خالی جدید با ظرفیت اولیه پیش فرض (11 درایه) و load factor=0.75 ایجاد می کند.

Hashtable(int capacity)

مشابه سازنده قبلی است با این تفاوت که در اینجا خودمان اندازه جدول اولیه را تعریف می کنیم.

Hashtable(int capacity,float loadFactor)

یک Hashtable خالی ایجاد می کند که اندازه جدول و loadFactor آن را خودمان تعیین می کنیم.(پارامتر loadFactor مشخص می کند که چه زمانی اندازه Hashtable باید تغییر کند.)

Hashtable(Map mp)

یک Hashtable جدید ایجاد می کند و اعضای mp را به آن اضافه می کند. متد های مهم این کلاس در جدول زیر آمده اند :

متد کاربرد
clear() کل مجموعه را پاک می کند.
contains(Object value) وجود یک مقدار را در مجموعه بررسی می کند.
containsKey(Object key) وجود یک کلید را در مجموعه بررسی می کند.
containsValue(Object value) وجود یک مقدار را بررسی می کند.
elements() یک Enumeration از مقدار ها بر می گرداند.
Set entrySet() یک Set از زوج های کلید-مقدار بر می گرداند.
equals(Object o) تساوی این مجموعه را با مجموعه دیگری بررسی می کند.
get(Object key) مقدار متناظر با یک کلید را در اختیار ما قرار می دهد.
boolean isEmpty() خالی بودن مجموعه را بررسی می کند.
keys() یک Enumeration از کلید ها بر می گرداند.
keySet() یک Set از کلید ها بر می گرداند.
put(Object key,Object value) مقدار value را به کلید key نسبت می دهد.
putAll(Map mp) اعضای یک Map دیگر را به مجموعه اضافه می کند.
remove(Object key) کلید مورد نظر (key) و مقدار متناظر با آن را از مجموعه پاک می کند.
size() تعداد کلید ها را بر می گرداند.
toString() کل مجموعه را به صورت یک رشته متنی بر می گرداند.
Collection values() مقدار ها را به صورت یک کالکشن بر می گرداند.

به مثال زیر توجه کنید :

import java.util.Hashtable;

public class HashtableDemo 
{
    public static void main(String[] args) 
    {
        Hashtable hashtable = new Hashtable();

        hashtable.put(1, "one");
        hashtable.put(2, "two");
        hashtable.put(3, "three");

        System.out.println(hashtable);

        System.out.println(hashtable.get(2));

        System.out.println(hashtable.keySet());

        System.out.println(hashtable.values());
    }
}
{3 = three, 2 = two, 1 = one}
two
[3, 2, 1]
[three, two, one]

در کد بالا ابتدا یک Hashtable جدید ایجاد می کنیم و با استفاده از متد put مقداری اطلاعات به آن اضافه می کنیم.سپس کل مجموعه را چاپ می کنیم. در ادامه مقدار متناظر با کلید 2 را چاپ کرده و سپس با استفاده از متد keySet مجموعه کلید ها و با استفاده از متد values مجموعه مقادیر را چاپ می کنیم.

پیمایش با Enumeration

اگر برای پیمایش اعضا Enumeration را ترجیح می دهید می توانید از متد های keys برای به دست آوردن Enumeration مربوط به کلید ها و از متد elements برای به دست آوردن Enumeration مربوط به مقادیر استفاده کنید. کد زیر کلید ها و مقدار ها را با استفاده از Enumeration پیمایش می کند.

import java.util.Enumeration;
import java.util.Hashtable;

public class HashtableDemo 
{
    public static void main(String[] args) 
    {
        Hashtable hashtable = new Hashtable();

        hashtable.put(1, "one");
        hashtable.put(2, "two");
        hashtable.put(3, "three");

        for (Enumeration key = hashtable.keys(); key.hasMoreElements();)
        {
            System.out.print(key.nextElement() + " ");
        }

        System.out.println();

        for (Enumeration value = hashtable.elements(); value.hasMoreElements();)
        {
            System.out.print(value.nextElement() + " ");
        }

    }
}
3 2 1
three two one

در داخل حلقه for ابتدا یک Enumeration به دست می آوریم ، سپس با متد hasMoreElements بررسی می کنیم که عنصر بعدی ای وجود دارد یا خیر؟ در صورت که عنصر دیگری وجود داشته باشد عنصر بعدی را با متد nextElement به دست آورده و آن را چاپ می کنیم.