Lớp Hashtable của Java

Giới thiệu

Xin chào các nhà thuật toán Java tương lai! Hôm nay, chúng ta sẽ bắt đầu hành trình hấp dẫn vào thế giới Java Hashtables. Tôi biết bạn có thể suy nghĩ gì: "Hashtables? Đó có vui như đứng nhìn vào bức sơn khô!" Nhưng hãy tin tôi, khi bạn hiểu sức mạnh của Hashtables, bạn sẽ thấy chúng làm cho cuộc sống lập trình của bạn trở nên dễ dàng hơn nhiều.

Java - Hashtable

Hãy tưởng tượng bạn đang cố gắng tổ chức bộ sưu tập rất lớn của các con vịt nhựa của mình (vì ai mà không có một cái như vậy, phải không?). Bạn có thể để tất cả chúng vào một hộp lớn, nhưng sau đó tìm kiếm con vịt nhựa cướp biển yêu thích của bạn sẽ trở thành một cơn ác mộng. Đó là nơi Hashtable ra đời - nó như là để mỗi con vịt có một giá như riêng của mình, để bạn có thể tìm thấy bất kỳ con vịt nào trong chốc lát!

Khai báo lớp

Hãy bắt đầu với những điều cơ bản. Trong Java, một Hashtable được khai báo như sau:

public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable

Đừng để điều này làm bạn sợ! Đó chỉ là cách Java nói: "Hei, tôi là một Hashtable, và tôi có thể làm việc với các loại khóa (K) và giá trị (V) khác nhau." Hãy nghĩ về nó như một container thông minh có thể chứa các cặp điều gì đó, như một tên (khóa) và một số điện thoại (giá trị).

Các hàm khởi tạo của lớp

Bây giờ, hãy xem cách chúng ta có thể tạo một Hashtable. Nó như việc xây dựng giá như của bạn:

// Tạo một Hashtable trống
Hashtable<String, Integer> duckCollection = new Hashtable<>();

// Tạo một Hashtable với khả năng ban đầu
Hashtable<String, Integer> bigDuckCollection = new Hashtable<>(100);

// Tạo một Hashtable từ một Map khác
Map<String, Integer> existingDucks = new HashMap<>();
Hashtable<String, Integer> copiedDucks = new Hashtable<>(existingDucks);

Trong ví dụ đầu tiên, chúng ta đang tạo một giá trống cho các con vịt của mình. Trong ví dụ thứ hai, chúng ta đang nói: "Tôi sẽ có nhiều con vịt, hãy để chúng ta tạo một giá lớn!" Và trong ví dụ thứ ba, chúng ta đang sao chép các con vịt từ bộ sưu tập khác.

Các phương thức của lớp

Hashtables đi kèm với một bộ công cụ đầy đủ các phương thức hữu ích. Hãy khám phá một số từ chúng:

Hashtable<String, Integer> duckInventory = new Hashtable<>();

// Thêm một con vịt
duckInventory.put("Rubber Pirate Duck", 5);

// Lấy số lượng con vịt cướp biển
int pirateDucks = duckInventory.get("Rubber Pirate Duck");

// Kiểm tra xem chúng ta có con vịt nindo không
boolean hasNinjaDucks = duckInventory.containsKey("Rubber Ninja Duck");

// Loại bỏ tất cả các con vịt (ôi không!)
duckInventory.clear();

// Kiểm tra xem kho của chúng ta có trống không
boolean isDucklessAndSad = duckInventory.isEmpty();

Mỗi phương thức này giúp chúng ta quản lý bộ sưu tập vịt của mình. Chúng ta có thể thêm vịt, kiểm tra số lượng mà chúng ta có, xem xét liệu chúng ta có một loại cụ thể, làm sạch bộ sưu tập của chúng ta (nhưng tại sao bạn nên làm vậy?), và kiểm tra xem chúng ta đã hết vịt hay không (một tai nạn khổng lồ!).

Các phương thức kế thừa

Hashtable là một phần của gia đình lớn hơn trong Java, và nó kế thừa một số phương thức từ các thành viên trong gia đình của nó. Dưới đây là bảng một số phương thức quan trọng kế thừa:

Phương thức Kế thừa từ Mô tả
clone() Object Tạo một bản sao mềm của Hashtable
equals(Object o) Object So sánh Hashtable này với một đối tượng khác
hashCode() Object Trả về mã băm cho Hashtable này
toString() Object Trả về một chuỗi đại diện cho Hashtable
putAll(Map<? extends K,? extends V> t) Map Sao chép tất cả các ánh xạ từ Map xác định đến Hashtable này

Những phương thức này như những tính năng bổ sung cho giá của bạn. Bạn có thể sao chép bộ sưu tập của bạn, so sánh nó với các bộ sưu tập khác, nhận mã duy nhất cho nó, chuyển đổi nó thành mô tả, hoặc thậm chí thêm một số vịt đột ngột!

Ví dụ thêm một cặp Integer, Integer vào HashTable

Hãy đặt tất cả kiến thức này vào thực tế với một ví dụ phức tạp hơn:

public class DuckCounter {
public static void main(String[] args) {
// Tạo một Hashtable để lưu trữ các loại vịt và số lượng của chúng
Hashtable<Integer, Integer> duckCensus = new Hashtable<>();

// Thêm một số số lượng vịt
duckCensus.put(1, 10);  // Loại vịt 1: 10 con vịt
duckCensus.put(2, 15);  // Loại vịt 2: 15 con vịt
duckCensus.put(3, 5);   // Loại vịt 3: 5 con vịt

// In ra số đăng ký vịt của chúng ta
System.out.println("Duck Census: " + duckCensus);

// Hãy thêm nhiều vịt hơn của loại 2
int currentType2Count = duckCensus.get(2);
duckCensus.put(2, currentType2Count + 5);

// Kiểm tra số lượng cập nhật
System.out.println("Updated Duck Census: " + duckCensus);

// Ôi không! Tất cả các con vịt của loại 3 đã bay đi
duckCensus.remove(3);

// Số lượng vịt cuối cùng
System.out.println("Final Duck Census: " + duckCensus);
}
}

Trong ví dụ này, chúng ta sử dụng một Hashtable để theo dõi các loại vịt khác nhau. Mỗi loại vịt được đánh dấu bằng một số (khóa), và chúng ta lưu trữ số lượng vịt (giá trị). Chúng ta thêm vịt, cập nhật số lượng của chúng, và thậm chí xử lý tình huống các con vịt bay đi của loại 3!

Khi bạn chạy mã này, bạn sẽ thấy cách dân số vịt của chúng ta thay đổi theo thời gian. Nó như là làm việc của một nhà thống kê vịt, nhưng lại thú vị hơn và ít khi bị đuổi bắt bởi các con chim úa giận dữ.

Và thế là, các bạn đã bước đi đầu tiên vào thế giới của Java Hashtables. Hãy nhớ, luyện tập sẽ làm bạn hoàn hảo, vì vậy đừng sợ thử nghiệm với bộ sưu tập dữ liệu của riêng bạn. Chúc các bạn lập trình vui vẻ!

Credits: Image by storyset