Trong bài này, chúng ta sẽ tìm hiểu về WeakHashMap trong Java và các toán tử của nó qua các ví dụ. Chúng ta cũng sẽ tìm hiểu về sự khác biệt giữa WeakHashMap và HashMap

Class WeakHashMap của collections framework trong Java cung cấp các tính năng của cấu trúc dữ liệu hash table.

Nó triển khai Map interface.

Lưu ý : Các key của WeakHashMap thuộc kiểu Tham chiếu yếu .

Đối tượng của kiểu tham chiếu yếu có thể là rác được thu thập trong Java nếu tham chiếu không còn được sử dụng trong chương trình.

Trước tiên chúng ta hãy học cách tạo ra một WeakHashMap. Sau đó, chúng ta sẽ tìm hiểu nó khác với hashmap như thế nào.

1. Tạo một WeakHashMap

Để tạo một WeakHashMap, tiên chúng ta phải import gói java.util.WeakHashMap. Khi đã import xong, chúng ta có thể tạo các WeakHashMap trong Java theo cách sau.

//WeakHashMap creation with capacity 8 and load factor 0.6
WeakHashMap<Key, Value> numbers = new WeakHashMap<>(8, 0.6);

Trong đoạn code trên, chúng ta đã tạo ra một WeakHashMap có tên numbers.

Ở đây,

key – một mã định danh duy nhất được sử dụng để liên kết từng phần tử (giá trị) trong map

value – các phần tử được liên kết bởi các key trong map

Chú ý phần new WeakHashMap<>(8, 0.6). Ở đây, tham số đầu tiên là capacity và tham số thứ hai là loadFactor .

capacity  – Dung lượng của map này là 8. Ý nghĩa: nó có thể lưu trữ 8 mục.

loadFactor – Hệ số tải của map này là 0,6. Điều này có nghĩa là bất cứ khi nào hash table của chúng ta được lấp đầy 60%, các mục mới được nhập vào sẽ được chuyển sang hash table mới có kích thước gấp đôi hash table ban đầu.

2. Dung lượng và hệ số tải mặc định

Có thể tạo ra một WeakHashMap mà không xác định dung lượng và hệ số tải của nó. Ví dụ,

// WeakHashMap with default capacity and load factor
WeakHashMap<Key, Value> numbers1 = new WeakHashMap<>();

Theo mặc định,

  • Dung lượng của map sẽ là 16
  • Hệ số tải sẽ là 0,75

3. Sự khác biệt giữa HashMap và WeakHashMap

Chúng ta hãy xem xét việc triển khai một WeakHashMap trong Java.

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

import java.util.WeakHashMap;

class Main {
    public static void main(String[] args) {
        // Creating WeakHashMap of numbers
        WeakHashMap<String, Integer> numbers = new WeakHashMap<>();

        String two = new String("Two");
        Integer twoValue = 2;
        String four = new String("Four");
        Integer fourValue = 4;

        // Inserting elements
        numbers.put(two, twoValue);
        numbers.put(four, fourValue);
        System.out.println("WeakHashMap: " + numbers);

        // Make the reference null
        two = null;

        // Perform garbage collection
        System.gc();

        System.out.println("WeakHashMap after garbage collection: " + numbers);
    }
}

Kết quả

WeakHashMap: {Four=4, Two=2}
WeakHashMap after garbage collection: {Four}

Như chúng ta có thể thấy, khi key two của một WeakHashMap được gán bằng nullvà thực hiện thu gom rác, key này được loại bỏ.

Đó là bởi vì, khácvới các hashtag, các key của WeakHashMap thuộc loại tham chiếu yếu. Điều này có nghĩa là mục nhập của map được bộ thu gom rác xóa bỏ nếu key cho mục đó không còn được sử dụng. Điều này là rất hữu ích trong việc tiết kiệm tài nguyên.

Bây giờ chúng ta hãy xem xét việc triển khai tương tự trong một hashmap.

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

import java.util.HashMap;

class Main {
    public static void main(String[] args) {
        // Creating HashMap of even numbers
        HashMap<String, Integer> numbers = new HashMap<>();

        String two = new String("Two");
        Integer twoValue = 2;
        String four = new String("Four");
        Integer fourValue = 4;

        // Inserting elements
        numbers.put(two, twoValue);
        numbers.put(four, fourValue);
        System.out.println("HashMap: " + numbers);

        // Make the reference null
        two = null;

        // Perform garbage collection
        System.gc();

        System.out.println("HashMap after garbage collection: " + numbers);
    }
}

Kết quả

HashMap: {Four=4, Two=2}
HashMap after garbage collection: {Four=4, Two=2}

Ở đây, khi key two của hashmap được đặt thành null và thực hiện thu gom rác, key không bị xóa.

Điều này là do, khác với WeakHashMap, các key của hashmap thuộc kiểu tham chiếu mạnh. Điều này có nghĩa là mục nhập của map không bị trình thu gom rác xóa bỏ mặc dù key của mục đó không còn được sử dụng.

Lưu ý : Tất cả các chức năng của hashmap và WeakHashMap là tương tự nhau ngoại trừ việc các key của WeakHashMap là tham chiếu yếu, trong khi các key của hashmap là tham chiếu mạnh.

4. Tạo WeakHashMap từ các map khác

Dưới đây là cách chúng ta có thể tạo một WeakHashMap từ các map khác.

import java.util.HashMap;
import java.util.WeakHashMap;

class Main {
    public static void main(String[] args) {
        // Creating a hashmap of even numbers
        HashMap<String, Integer> evenNumbers = new HashMap<>();

        String two = new String("Two");
        Integer twoValue = 2;
        evenNumbers.put(two, twoValue);
        System.out.println("HashMap: " + evenNumbers);

        // Creating a weak hash map from other hashmap
        WeakHashMap<String, Integer> numbers = new WeakHashMap<>(evenNumbers);

        System.out.println("WeakHashMap: " + numbers);
    }
}

Kết quả

HashMap: {Two=2}
WeakHashMap: {Two=2}

5. Các hàm của WeakHashMap

Class WeakHashMap cung cấp các hàm cho phép chúng ta thực hiện các toán tử khác nhau trên map.

6. Chèn các phần tử vào WeakHashMap

  • put() – chèn cặp key/ value được chỉ định vào map
  • putAll() – chèn tất cả các mục từ map được chỉ định vào map này
  • putIfAbsent() – chèn cặp key/ value được chỉ định vào map nếu key được chỉ định không có trong map

Ví dụ,

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

import java.util.WeakHashMap;

class Main {
    public static void main(String[] args) {
        // Creating WeakHashMap of even numbers
        WeakHashMap<String, Integer> evenNumbers = new WeakHashMap<>();

        String two = new String("Two");
        Integer twoValue = 2;

        // Using put()
        evenNumbers.put(two, twoValue);

        String four = new String("Four");
        Integer fourValue = 4;

        // Using putIfAbsent()
        evenNumbers.putIfAbsent(four, fourValue);
        System.out.println("WeakHashMap of even numbers: " + evenNumbers);

        //Creating WeakHashMap of numbers
        WeakHashMap<String, Integer> numbers = new WeakHashMap<>();

        String one = new String("One");
        Integer oneValue = 1;
        numbers.put(one, oneValue);

        // Using putAll()
        numbers.putAll(evenNumbers);
        System.out.println("WeakHashMap of numbers: " + numbers);
    }
}

Kết quả

WeakHashMap of even numbers: {Four=4, Two=2}
WeakHashMap of numbers: {Two=2, Four=4, One=1}

7. Truy cập các phần tử WeakHashMap

7.1 Sử dụng hàm entryset (), keyset () và value ()

  • entrySet() – trả về một tập hợp tất cả cặp key/ value của map
  • keySet() – trả về một tập hợp tất cả các key của map
  • values() – trả về một tập hợp tất cả các value của map

Ví dụ,

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

import java.util.WeakHashMap;

class Main {
    public static void main(String[] args) {
        // Creating WeakHashMap of even numbers
        WeakHashMap<String, Integer> numbers = new WeakHashMap<>();

        String one = new String("One");
        Integer oneValue = 1;
        numbers.put(one, oneValue);

        String two = new String("Two");
        Integer twoValue = 2;
        numbers.put(two, twoValue);

        System.out.println("WeakHashMap: " + numbers);

        // Using entrySet()
        System.out.println("Key/Value mappings: " + numbers.entrySet());

        // Using keySet()
        System.out.println("Keys: " + numbers.keySet());

        // Using values()
        System.out.println("Values: " + numbers.values());
    }
}

Kết quả

WeakHashMap: {Two=2, One=1}
Key/Value mappings: [Two=2, One=1]
Keys: [Two, One]
Values: [1, 2]

7.2 Sử dụng hàm get () và getOrDefault ()

  • get()- Trả về value liên quan đến key được chỉ định. Trả về null nếu không tìm thấy key.
  • getOrDefault()- Trả về value liên quan đến key được chỉ định. Trả về value mặc định đã chỉ định nếu không tìm thấy key.

Ví dụ,

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

import java.util.WeakHashMap;

class Main {
    public static void main(String[] args) {
        // Creating WeakHashMap of even numbers
        WeakHashMap<String, Integer> numbers = new WeakHashMap<>();

        String one = new String("One");
        Integer oneValue = 1;
        numbers.put(one, oneValue);

        String two = new String("Two");
        Integer twoValue = 2;
        numbers.put(two, twoValue);

        System.out.println("WeakHashMap: " + numbers);

        // Using get()
        int value1 = numbers.get("Two");
        System.out.println("Using get(): " + value1);

        // Using getOrDefault()
        int value2 = numbers.getOrDefault("Four", 4);
        System.out.println("Using getOrDefault(): " + value2);

    }
}

Kết quả

WeakHashMap: {Two=2, One=1}
Using get(): 2
Using getOrDefault(): 4

8. Xóa các phần tử của WeakHashMap

  • remove(key) – trả về và xóa mục nhập được liên kết với key được chỉ định khỏi map
  • remove(key, value) – chỉ xóa mục nhập khỏi map nếu key được chỉ định liên kết với value đã chỉ định và trả về giá trị boolean

Ví dụ,

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

import java.util.WeakHashMap;

class Main {
    public static void main(String[] args) {
        // Creating WeakHashMap of even numbers
        WeakHashMap<String, Integer> numbers = new WeakHashMap<>();

        String one = new String("One");
        Integer oneValue = 1;
        numbers.put(one, oneValue);

        String two = new String("Two");
        Integer twoValue = 2;
        numbers.put(two, twoValue);

        System.out.println("WeakHashMap: " + numbers);

        // Using remove() with single parameter
        int value = numbers.remove("Two");
        System.out.println("Removed value: " + value);

        // Using remove() with 2 parameters
        boolean result = numbers.remove("One", 3);
        System.out.println("Is the entry {One=3} removed? " + result);

        System.out.println("Updated WeakHashMap: " + numbers);
    }
}

Kết quả

WeakHashMap: {Two=2, One=1}
Removed value: 2
Is the entry {One=3} removed? False
Updated WeakHashMap: {One=1}

9. Các hàm khác của WeakHashMap

HàmMô tả
clear()Xóa tất cả các mục khỏi map
containsKey()Kiểm tra xem map có chứa key được chỉ định hay không và trả về giá trị boolean
containsValue()Kiểm tra xem map có chứa value được chỉ định hay không và trả về giá trị boolean
size()Trả về kích thước của map
isEmpty()Kiểm tra xem map có trống không và trả về giá trị boolean

Để tìm hiểu thêm, hãy truy cập Java WeakHashMap (tài liệu Java chính thức) .

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!