Lớp WeakHashMap trong Java: Hướng dẫn cho người mới bắt đầu

Giới thiệu

Xin chào các bạn, những nhà lập trình Java tương lai! Hôm nay, chúng ta sẽ đào sâu vào thế giới thú vị của WeakHashMap trong Java. Đừng lo nếu bạn chưa từng nghe về nó - chúng ta sẽ bắt đầu từ đầu và dần dần tiến triển. Bằng cách kết thúc hướng dẫn này, bạn sẽ trở thành một chuyên gia WeakHashMap!

Java - WeakHashMap

WeakHashMap là gì?

Hãy tưởng tượng bạn đang tổ chức một buổi tiệc lớn, và bạn có một danh sách khách mời. Nhưng đây không phải là danh sách khách mời bình thường - đây là một danh sách ma thuật tự động loại bỏ những người không thể tham gia nữa. Đó là một chút như điều gì WeakHashMap làm trong Java, nhưng với các đối tượng thay vì khách mời buổi tiệc!

WeakHashMap là một loại đặc biệt của Map trong Java, cho phép các khóa của nó được thu hồi rác khi họ không còn được sử dụng nào nữa trong chương trình của bạn. Điều này có thể rất hữu ích khi bạn muốn tạo một bộ nhớ tạm thời mà không ngăn cản các đối tượng bị xóa khi không còn cần thiết.

Khai báo lớp

Hãy bắt đầu bằng cách nhìn thấy cách chúng ta khai báo một WeakHashMap:

import java.util.WeakHashMap;

public class WeakHashMapExample {
public static void main(String[] args) {
WeakHashMap<String, Integer> myWeakMap = new WeakHashMap<>();
}
}

Trong ví dụ này, chúng ta đang tạo một WeakHashMap sử dụng các đối tượng String làm khóa và các đối tượng Integer làm giá trị. Phần <String, Integer> được gọi là "generics" - như là việc kể Java loại đối tượng mà chúng ta muốn lưu trữ trong bản đồ của mình.

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

WeakHashMap có bốn khởi tạo khác nhau. Hãy nhìn thấy mỗi khởi tạo:

  1. Khởi tạo mặc định:

    WeakHashMap<String, Integer> map1 = new WeakHashMap<>();

    Điều này tạo ra một WeakHashMap trống với khả năng khởi tạo mặc định (16) và hệ số tải (0.75).

  2. Khởi tạo với khả năng khởi tạo:

    WeakHashMap<String, Integer> map2 = new WeakHashMap<>(100);

    Điều này tạo ra một WeakHashMap với khả năng khởi tạo cụ thể và hệ số tải mặc định.

  3. Khởi tạo với khả năng khởi tạo và hệ số tải:

    WeakHashMap<String, Integer> map3 = new WeakHashMap<>(100, 0.8f);

    Điều này tạo ra một WeakHashMap với khả năng khởi tạo và hệ số tải cụ thể.

  4. Khởi tạo với một Map khác:

    Map<String, Integer> existingMap = new HashMap<>();
    existingMap.put("Alice", 25);
    existingMap.put("Bob", 30);
    WeakHashMap<String, Integer> map4 = new WeakHashMap<>(existingMap);

    Điều này tạo ra một WeakHashMap với các ánh xạ tương tự như Map được chỉ định.

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

WeakHashMap cung cấp một số phương thức để thao tác và truy cập nội dung của nó. Dưới đây là bảng một số phương thức thường được sử dụng nhất:

Phương thức Mô tả
put(K key, V value) Thêm một cặp khóa-giá trị vào bản đồ
get(Object key) Truy xuất giá trị liên kết với khóa cụ thể
remove(Object key) Loại bỏ ánh xạ cho khóa cụ thể
size() Trả về số lượng các ánh xạ khóa-giá trị trong bản đồ
clear() Loại bỏ tất cả các ánh xạ khỏi bản đồ
containsKey(Object key) Trả về true nếu bản đồ chứa khóa cụ thể
containsValue(Object value) Trả về true nếu bản đồ chứa giá trị cụ thể
isEmpty() Trả về true nếu bản đồ không chứa các ánh xạ khóa-giá trị

Hãy xem một số phương thức này hoạt động:

WeakHashMap<String, Integer> ageMap = new WeakHashMap<>();

// Thêm các cặp khóa-giá trị
ageMap.put("Alice", 25);
ageMap.put("Bob", 30);
ageMap.put("Charlie", 35);

// Truy xuất giá trị
System.out.println("Tuổi của Alice: " + ageMap.get("Alice")); // Output: Tuổi của Alice: 25

// Kiểm tra nếu khóa tồn tại
System.out.println("David có trong bản đồ không? " + ageMap.containsKey("David")); // Output: David có trong bản đồ không? false

// Loại bỏ một cặp khóa-giá trị
ageMap.remove("Bob");
System.out.println("Kích thước bản đồ sau khi loại bỏ Bob: " + ageMap.size()); // Output: Kích thước bản đồ sau khi loại bỏ Bob: 2

// Xóa bản đồ
ageMap.clear();
System.out.println("Bản đồ có trống không? " + ageMap.isEmpty()); // Output: Bản đồ có trống không? true

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

WeakHashMap kế thừa các phương thức từ các lớp và giao diện cha mẹ. Dưới đây là một số phương thức quan trọng kế thừa:

Kế thừa từ Các phương thức
java.util.AbstractMap clone(), equals(), hashCode(), toString()
java.util.Map entrySet(), keySet(), values()
java.lang.Object finalize(), getClass(), notify(), notifyAll(), wait()

Ví dụ thêm một cặp khóa-giá trị vào WeakHashMap của cặp Integer, Integer

Bây giờ, hãy nhìn thấy một ví dụ hoàn chỉnh hơn về việc sử dụng WeakHashMap với các khóa và giá trị Integer:

import java.util.WeakHashMap;

public class WeakHashMapExample {
public static void main(String[] args) {
WeakHashMap<Integer, Integer> squareMap = new WeakHashMap<>();

// Thêm các cặp khóa-giá trị
for (int i = 1; i <= 5; i++) {
squareMap.put(i, i * i);
}

System.out.println("Bản đồ ban đầu: " + squareMap);

// Truy cập giá trị
System.out.println("Bình phương của 3: " + squareMap.get(3));

// Loại bỏ một cặp khóa-giá trị
squareMap.remove(2);
System.out.println("Bản đồ sau khi loại bỏ 2: " + squareMap);

// Kiểm tra nếu khóa tồn tại
System.out.println("Bản đồ có chứa 4 không? " + squareMap.containsKey(4));

// Kiểm tra nếu giá trị tồn tại
System.out.println("Bản đồ có chứa giá trị 16 không? " + squareMap.containsValue(16));

// Duyệt qua bản đồ
System.out.println("Duyệt qua bản đồ:");
for (Integer key : squareMap.keySet()) {
System.out.println("Khóa: " + key + ", Giá trị: " + squareMap.get(key));
}
}
}

Output

Khi bạn chạy mã này, bạn sẽ thấy đầu ra tương tự như này:

Bản đồ ban đầu: {5=25, 4=16, 3=9, 2=4, 1=1}
Bình phương của 3: 9
Bản đồ sau khi loại bỏ 2: {5=25, 4=16, 3=9, 1=1}
Bản đồ có chứa 4 không? true
Bản đồ có chứa giá trị 16 không? true
Duyệt qua bản đồ:
Khóa: 5, Giá trị: 25
Khóa: 4, Giá trị: 16
Khóa: 3, Giá trị: 9
Khóa: 1, Giá trị: 1

Và thế là! Bạn đã bước đầu tiên vào thế giới của WeakHashMap trong Java. Nhớ rằng, sức mạnh thực sự của WeakHashMap đến từ khả năng cho phép các khóa được thu hồi rác khi họ không còn được tham chiếu nào nữa trong chương trình của bạn. Điều này có thể rất hữu ích trong một số tình huống cụ thể, như việc triển khai các bộ nhớ tạm thời hoặc quản lý dữ liệu tạm thời.

Khi bạn tiếp tục hành trình của mình với Java, bạn sẽ khám phá nhiều tình huống hơn nữa trong đó WeakHashMap có thể là một công cụ quý giá trong hộp công cụ lập trình của bạn. Hãy tiếp tục tập luyện, khám phá và quan trọng nhất, hãy có niềm vui khi lập trình!

Credits: Image by storyset