1. Hashtable trong Java là gì?

Hashtable trong Java là một cấu trúc dữ liệu được cài đặt một bảng băm để ánh xạ các khóa key đến các giá trị value. Trong Java, lớp Hashtable() được kế thừa lại từ lớp trừu tượng Dictionary() và được thực hiện trên interface của lớp Map() trong Java.

Hashtable là một mảng của List. Mỗi List sẽ được coi là một thùng chứa các phần tử. Vị trí của thùng chừa này được xác định bằng cách gọi phương thức hashcode(). Các Hashtable kế thừa theo lớp trừu tượng Dictionary() vì vậy chúng cũng thực hiện lưu trữ phần tử dưới dạng key => value như lớp cha Dictionary() của nó.

Tuy nhiên, lớp Hashtable được đồng bộ hóa và chúng ta KHÔNG thể lưu trữ các phần tử có chứa giá trị keyNULL hoặc giá trị valueNULL. Các key trong Hashtable phải là tồn tại duy nhất – điều này nghĩa là cấu trúc Hashtable không cho phép chúng ta sử dụng lặp lại key.

Kích thước mặc định ban đầu của lớp Hashtable() là 11 trong khi đó hệ số tải loadFactor là 0,75. Lớp Hashtable này thuộc trong thư viện java.util và để sử dụng được lớp Hashtable trong thư viện trên ta cần nhập thư viện: import java.util.*;

2. Khai báo Hashtable trong Java

Trong Java, một lớp Hashtable() đã được xây dựng sẵn và lớp này được đặt trong thư viện của java.util, vì vậy để sử dụng được Hashtable trong Java ta chỉ cần khai báo (khởi tạo) một lớp có tên là Hashtable() – lớp này tồn tại 4 constructor giúp ta định nghĩa ra kiểu Hashtable trong Java. Cú pháp khởi tạo Hashtable() trong Java như sau:

Hashtable<TypeKey,TypeValue> name_hashtable = new Hashtable<TypeKey,TypeValue>();

Trong đó:

  • TypeKey là kiểu dữ liệu lưu trữ các Key trong Hashtable
  • TypeValue là kiểu dữ liệu lưu trữ các giá trị Value trong Hashtable
  • name_hashtable là tên của Hashtable cần khởi tạo

Các constructor của lớp Hashtable() được mô tả ở bảng bên dưới đây:

Hàm khởi tạo  Mô tả
Hashtable() Tạo một Hashtable trống có kích thước và hệ số tải mặc định ban đầu. (size = 11 và loadFactor = 0.75)
Hashtable(int size) Tạo một Hashtable và chỉ định kích thước là size.
Hashtable(int size, float loadFactor) Tạo một Hashtable với chỉ định kích thước là size và hệ số tải là loadFactor.
Hashtable(Map m) Tạo một Hashtable mà được khởi tạo với các phần tử trong m. Kích thước của Hash table đó gấp 2 lần số phần tử trong m. Hệ số tải loadFactor của Hashtable đó sẽ là 0.75

Chương trình dưới đây, sẽ khởi tạo một Hashtable trong Java bằng cách gọi đến lớp Hashtable() thuộc thư viện java.util và sau khi khởi tạo thành công sẽ là một Hashtable rỗng:

import java.util.*;  
class Hashtable1{  
    public static void main(String args[]){ 
    	//Tao mot Hashtable voi KEY kieu Integer va VALUE kieu String
        Hashtable<Integer,String> hashtable = new Hashtable<Integer,String>();
        //Kiem tra hashtable vua tao co rong khong?
        boolean result = hashtable.isEmpty();
        System.out.println("Hashtable vua tao co rong khong? " + result); 
        //Kiem tra so luong phan tu trong hashtable vua tao
        System.out.println("So luong phan tu trong Hashtable vua tao: " + hashtable.size());
        //Hien thi phan tu trong hashtable vua tao
        System.out.println("Phan tu trong Hashtable " + hashtable);
    }  
}

Kết quả:

Hashtable vua tao co rong khong? true
So luong phan tu trong Hashtable vua tao: 0
Phan tu trong Hashtable {}

Lưu ý: Vì lớp Hashtable() đã kế thừa lại lớp trừu tượng Dictionary() nên ta hoàn toàn có thể sử dụng các phương thức có trong lớp cha Dictionary() của nó.

3. Thao tác với Hashtable trong Java

Hashtable cũng thực hiện lưu trữ các phần tử dưới dạng key => value vì vậy các thao tác của Hashtable và Dictionary cũng có sự tương đồng với nhau. Chúng ta hoàn toàn có thể thêm phần tử vào Hashtable (put), duyệt qua các phần tử Hashtable, xóa phần tử có trong Hashtable (remove), tìm kiếm phần tử trong Hashtable…

3.1 Thêm phần tử vào Hashtable bằng Hashtable.put()

Hashtable ban đầu được khởi tạo sẽ là một Hashtable rỗng, vì vậy mà khi cần làm việc với kiểu cấu trúc Hashtable này việc đầu tiên cần làm sẽ là thêm các phần tử vào trong nó.

Như ta đã biết, các Hashtable lưu trữ phần tử theo dạng key:value điều này nghĩa là ta cần khóa (key) và giá trị (value) thì mới cấu tạo nên một phần tử của Hashtable (giống với kiểu Dictionary trong Java). Vì vậy khi thêm một phần tử vào trong từ điển Hashtable ta sẽ cần thêm đồng thời các cặp giá trị key : value để lưu trữ.

Trong lớp Hashtable(), để thêm được một phần tử vào trong Hashtable ta chỉ cần gọi (truy cập) đến phương thức put(key,value) mà lớp này đã cũng cấp sẵn cho chúng ta để thêm mới một phần tử vào trong Hashtable. Như ví dụ dưới đây, chúng ta sẽ thêm 4 phần tử vào trong từ điển Hashtable thông qua phương thức put(key,value) như sau:

import java.util.*;  
class Hashtable1{  
    public static void main(String args[]){ 
    	//Tao mot Hashtable voi KEY kieu Integer va VALUE kieu String
        Hashtable<Integer,String> hashtable = new Hashtable<Integer,String>();
        //Them phan tu vao hashtable bang phuong thuc put()
        hashtable.put (100, "NguyenA");  
        hashtable.put (102, "NguyenB");  
        hashtable.put (101, "NguyenC");  
        hashtable.put (103, "NguyenD");  
        //Kiem tra hashtable co rong khong?
        boolean result = hashtable.isEmpty();
        System.out.println("Hashtable co rong khong? " + result); 
        //Kiem tra so luong phan tu trong hashtable 
        System.out.println("So luong phan tu cua Hashtable: " + hashtable.size());
        //Hien thi phan tu trong hashtable
        System.out.println("Phan tu trong Hashtable " + hashtable);
    }  
}

Kết quả:

Hashtable co rong khong? false
So luong phan tu cua Hashtable: 4
Phan tu trong Hashtable {103=NguyenD, 102=NguyenB, 101=NguyenC, 100=NguyenA}

3.2 Duyệt phần tử trong Hashtable

Để thực hiện duyệt các phần tử có trong Hashtable, ta chỉ cần sử dụng vòng lặp for để lấy ra từng Key của từng phần tử trong Hashtable – sau khi đã có Key ta hoàn toàn có thể sử dụng phương thức được tích hợp sẵn trong lớp Hashtable() đó chính là phương thức get(Key) để lấy ra giá trị value của phần tử đó.

import java.util.*;  
class Hashtable1{  
    public static void main(String args[]){ 
    	//Tao mot Hashtable voi KEY kieu Integer va VALUE kieu String
        Hashtable<Integer,String> hashtable = new Hashtable<Integer,String>();
        //Them phan tu vao hashtable bang phuong thuc put()
        hashtable.put (100, "NguyenA");  
        hashtable.put (102, "NguyenB");  
        hashtable.put (101, "NguyenC");  
        hashtable.put (103, "NguyenD");  
        //Hien thi phan tu trong hashtable
        System.out.println("Phan tu trong Hashtable \n" + hashtable);
        //Duyet hashtable bang for va phuong thuc get()
        System.out.println("Duyet qua key : value cua hashtable: ");
        Set<Integer> keySet = hashtable.keySet(); //Lay ta cac key co trong Hastable
        for (Integer key : keySet) {
            System.out.println(key + ":" + hashtable.get(key));
        }
    }  
}

Kết quả:

Phan tu trong Hashtable 
{103=NguyenD, 102=NguyenB, 101=NguyenC, 100=NguyenA}
Duyet qua key : value cua hashtable: 
103:NguyenD
102:NguyenB
101:NguyenC
100:NguyenA

3.3 Xóa phần tử trong Hashtable bằng Hashtable.remove()

Để xóa đi một phần tử trong Hashtable, khi đó ta cần phải có khóa (key) của phần tử cần xóa. Thực hiện xóa phần tử trong Hashtable sẽ đồng thời loại bỏ đi cả giá trị keyvalue của phần tử đó.

Để xóa đi một phần tử trong lớp Hashtable(), chúng ta có thể gọi đến phương thức remove(key) – tương tự với phương thức xóa của lớp Dictionary(). Phương thức remove(key) sẽ yêu cầu ta nhập vào khóa key của phần tử cần xóa bỏ. Như ví dụ dưới đây, chúng ta sẽ thêm các phần tử vào Hashtable bằng phương thức put(key,value) sau đó sẽ xóa đi 2 phần tử trong nó bằng phương thức remove(key) như sau:

import java.util.*;  
class Hashtable1{  
    public static void main(String args[]){ 
        //Tao mot Hashtable voi KEY kieu Integer va VALUE kieu String
        Hashtable<Integer,String> hashtable = new Hashtable<Integer,String>();
        //Them phan tu vao hashtable bang phuong thuc put()
        hashtable.put (100, "NguyenA");  
        hashtable.put (102, "NguyenB");  
        hashtable.put (101, "NguyenC");  
        hashtable.put (103, "NguyenD");
   
        //Kiem tra so luong phan tu trong hashtable ban dau
        System.out.println("So luong phan tu cua Hashtable ban dau: " + hashtable.size());
        //Hien thi phan tu trong hashtable ban dau
        System.out.println("Phan tu trong Hashtable ban dau: \n" + hashtable);
        
        //Xoa di 2 phan tu dau tien trong Hashtable dua theo KEY bang phuong thuc remove()
        hashtable.remove(100);
        hashtable.remove(102);
        
        //Kiem tra so luong phan tu trong hashtable sau khi xoa
        System.out.println("So luong phan tu cua Hashtable sau khi xoa: " + hashtable.size());
        //Hien thi phan tu trong hashtable sau khi xoa
        System.out.println("Phan tu trong Hashtable sau khi xoa: \n" + hashtable);
        
    }  
}

Kết quả:

So luong phan tu cua Hashtable ban dau: 4
Phan tu trong Hashtable ban dau: 
{103=NguyenD, 102=NguyenB, 101=NguyenC, 100=NguyenA}
So luong phan tu cua Hashtable sau khi xoa: 2
Phan tu trong Hashtable sau khi xoa: 
{103=NguyenD, 101=NguyenC}

3.4 Tìm kiếm phần tử Hashtable bằng Hashtable.getOrDefault()

Thao tác tìm kiếm phần tử trong Hashtable cũng được thực hiện thông qua Key – điều này nghĩa là ta cần có Key của phần tử cần tìm kiếm thì mới có thể tìm kiếm, kết quả của việc tìm kiếm phần tử dựa vào Key sẽ trả về cho chúng ta giá trị value của phần tử được tìm thấy!

Để tìm kiếm một phần tử trong Hashtable ta sẽ chỉ đơn giản gọi đến phương thức getOrDefault(Key,Error) được tích hợp sẵn trong lớp Hashtable(). Phương thức này nhận vào Key cần tìm kiếm và thông báo lỗi Error nếu như không tìm thấy phần tử bên trong Hashtable.

Như ví dụ dưới đây, chúng ta sẽ thêm các phần tử vào Hashtable bằng phương thức put(key,value) sau đó tìm kiếm phần tử có Key bằng 101Key bằng 105. Nếu tìm thấy phần tử dựa theo Key thì hiển thị giá trị value theo key đó, ngược lại nếu không tìm thấy sẽ hiển thị thông báo “Khong tim thay” như sau:

import java.util.*;  
class Hashtable1{  
    public static void main(String args[]){ 
        //Tao mot Hashtable voi KEY kieu Integer va VALUE kieu String
        Hashtable<Integer,String> hashtable = new Hashtable<Integer,String>();
        //Them phan tu vao hashtable bang phuong thuc put()
        hashtable.put (100, "NguyenA");  
        hashtable.put (102, "NguyenB");  
        hashtable.put (101, "NguyenC");  
        hashtable.put (103, "NguyenD");
        //Hien thi phan tu trong hashtable ban dau
        System.out.println("Phan tu trong Hashtable ban dau: \n" + hashtable);
        //Tim kiem phan tu co Key = 101 va Key = 105
        System.out.println("Ket qua tim kiem trong Hashtable:");
        System.out.println("101 => " + hashtable.getOrDefault(101, "Khong tim thay"));//NguyenC  
     	System.out.println("105 => " + hashtable.getOrDefault(105, "Khong tim thay"));//Khong tim thay  
    }  
}

Kết quả:

Phan tu trong Hashtable ban dau: 
{103=NguyenD, 102=NguyenB, 101=NguyenC, 100=NguyenA}
Ket qua tim kiem trong Hashtable:
101 => NguyenC
105 => Khong tim thay

4. Các phương thức của Hashtable trong Java

Dưới đây là một vài phương thức chính của lớp Hashtable() trong Java, các phương thức được liệt kê kèm tên và mô tả của phương thức đó:

Phương thức Mô tả
void clear() Xóa sạch phần tử trong Hashtable
Object clone() Trả về một bản sao của đối tượng đang gọi
boolean contains(Object value) Trả về true nếu có Key và Value cần tìm nằm trong Hashtable, ngược lại trả về false
boolean containsKey(Object key) Trả về true nếu có Key cần tìm nằm trong Hashtable, ngược lại trả về false
boolean containsValue(Object value) Trả về true nếu có Value cần tìm nằm trong Hashtable, ngược lại trả về false
Enumeration elements( ) Lấy ra tất cả các value được chứa trong Hashtable
Object get(Object key) Lấy giá trị Value giựa theo Key. Trả về Null nếu như Key KHÔNG tồn tại trong Hashtable
boolean isEmpty() Kiểm tra Hashtable có rỗng hay không?
Enumeration keys( ) Lấy ra tất cả các Key được chứa trong Hashtable
Object put(Object key, Object value) Thêm phần tử (key:value) vào trong Hashtable
void rehash() Tăng kích cỡ của hash table và làm lại mới tất cả các key của nó
Object remove(Object key) Xóa phần tử trong Hashtable giựa vào Key
int size() Kích thước của Hashtable
String toString() Ép kiểu các phần tử trong Hastable sang kiểu chuỗi