Trong hướng dẫn này, chúng ta sẽ tìm hiểu về Java WeakHashMap và các hoạt động của nó với sự trợ giúp của 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
Các WeakHashMap
lớp học của khuôn khổ bộ sưu tập Java cung cấp các tính năng của cấu trúc dữ liệu bảng băm …
Nó thực hiện giao diện Bản đồ.
Lưu ý : Các phím của bản đồ băm yếu thuộc loại WeakReference .
Đối tượng của kiểu tham chiếu yếu có thể được thu gom rác 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 một bản đồ băm yếu. Sau đó, chúng ta sẽ tìm hiểu nó khác với bản đồ băm như thế nào.
Tạo một WeakHashMap
Để tạo một hashmap yếu, java.util.WeakHashMap
trước tiên chúng ta phải nhập gói. Sau khi chúng tôi nhập gói, đây là cách chúng tôi có thể tạo các bản đồ băm yếu trong Java.
//WeakHashMap creation with capacity 8 and load factor 0.6 WeakHashMap numbers = new WeakHashMap(8, 0.6);
Trong đoạn mã trên, chúng tôi đã tạo một bản đồ băm yếu có tên là các số.
Đây,
- Khóa - một số nhận dạng duy nhất được sử dụng để liên kết từng phần tử (giá trị) trong bản đồ
- Giá trị - các yếu tố được liên kết bởi các khóa trong bản đồ
Chú ý phần new WeakHashMap(8, 0.6)
. Ở đây, tham số đầu tiên là dung lượng và tham số thứ hai là loadFactor .
- Dung lượng - Dung lượng của bản đồ này là 8. Có nghĩa là, nó có thể lưu trữ 8 mục nhập.
- loadFactor - Hệ số tải của bản đồ này là 0,6. Điều này có nghĩa là bất cứ khi nào bảng băm của chúng tôi được lấp đầy 60%, các mục nhập sẽ được chuyển sang một bảng băm mới có kích thước gấp đôi kích thước của bảng băm ban đầu.
Công suất mặc định và hệ số tải
Có thể tạo một bản đồ băm yếu mà không cần xác định dung lượng và hệ số tải của nó. Ví dụ,
// WeakHashMap with default capacity and load factor WeakHashMap numbers1 = new WeakHashMap();
Theo mặc định,
- dung lượng của bản đồ sẽ là 16
- hệ số tải sẽ là 0,75
Sự khác biệt giữa HashMap và WeakHashMap
Hãy để chúng tôi xem việc triển khai một bản đồ băm yếu trong Java.
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of numbers WeakHashMap 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); ) )
Đầu ra
Bản đồ WeakHashMap: (Bốn = 4, Hai = 2) Bản đồ WeakHashMap sau khi thu gom rác: (Bốn)
Như chúng ta có thể thấy, khi khóa hai của một bản đồ băm yếu được đặt thành null
và thực hiện thu gom rác, khóa sẽ bị xóa.
Đó là bởi vì không giống như các bản đồ băm, các khóa của bản đồ băm yếu thuộc loại tham chiếu yếu . Điều này có nghĩa là mục nhập bản đồ sẽ bị bộ thu gom rác loại bỏ nếu khóa của mục nhập đó không còn được sử dụng. Điều này rất hữu ích để tiết kiệm tài nguyên.
Bây giờ chúng ta hãy xem cách triển khai tương tự trong một bản đồ băm.
import java.util.HashMap; class Main ( public static void main(String() args) ( // Creating HashMap of even numbers HashMap 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); ) )
Đầu ra
HashMap: (Four = 4, Two = 2) HashMap sau khi thu gom rác: (Four = 4, Two = 2)
Ở đây, khi khóa hai của bản đồ băm được đặt thành null
và thực hiện thu gom rác, khóa sẽ không bị xóa.
Điều này là do không giống như các khóa bản đồ băm yếu của bản đồ băm thuộc loại tham chiếu mạnh . Điều này có nghĩa là mục nhập bản đồ không bị bộ thu gom rác loại bỏ mặc dù khóa của mục nhập đó không còn được sử dụng.
Note: All functionalities of hashmaps and weak hashmaps are similar except keys of a weak hashmap are of weak reference, whereas keys of a hashmap are of strong reference.
Creating WeakHashMap from Other Maps
Here is how we can create a weak hashmap from other maps.
import java.util.HashMap; import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating a hashmap of even numbers HashMap 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 numbers = new WeakHashMap(evenNumbers); System.out.println("WeakHashMap: " + numbers); ) )
Output
HashMap: (Two=2) WeakHashMap: (Two=2)
Methods of WeakHashMap
The WeakHashMap
class provides methods that allow us to perform various operations on the map.
Insert Elements to WeakHashMap
put()
- inserts the specified key/value mapping to the mapputAll()
- inserts all the entries from specified map to this mapputIfAbsent()
- inserts the specified key/value mapping to the map if the specified key is not present in the map
For example,
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap 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 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); ) )
Output
WeakHashMap of even numbers: (Four=4, Two=2) WeakHashMap of numbers: (Two=2, Four=4, One=1)
Access WeakHashMap Elements
1. Using entrySet(), keySet() and values()
entrySet()
- returns a set of all the key/value mapping of the mapkeySet()
- returns a set of all the keys of the mapvalues()
- returns a set of all the values of the map
For example,
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap 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()); ) )
Output
WeakHashMap: (Two=2, One=1) Key/Value mappings: (Two=2, One=1) Keys: (Two, One) Values: (1, 2)
2. Using get() and getOrDefault()
get()
- Returns the value associated with the specified key. Returnsnull
if the key is not found.getOrDefault()
- Returns the value associated with the specified key. Returns the specified default value if the key is not found.
For example,
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap 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); ) )
Output
WeakHashMap: (Two=2, One=1) Using get(): 2 Using getOrDefault(): 4
Remove WeakHashMap Elements
remove(key)
- returns and removes the entry associated with the specified key from the mapremove(key, value)
- removes the entry from the map only if the specified key mapped to the specified value and return a boolean value
For example,
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap 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); ) )
Output
WeakHashMap: (Hai = 2, Một = 1) Giá trị bị xóa: 2 Mục nhập (Một = 3) có bị xóa không? Bản đồ WeakHashMap cập nhật sai: (Một = 1)
Các phương pháp khác của WeakHashMap
phương pháp | Sự miêu tả |
---|---|
clear() | Xóa tất cả các mục khỏi bản đồ |
containsKey() | Kiểm tra xem bản đồ có chứa khóa được chỉ định hay không và trả về giá trị boolean |
containsValue() | Kiểm tra xem bản đồ có chứa giá trị được chỉ định hay không và trả về giá trị boolean |
size() | Trả về kích thước của bản đồ |
isEmpty() | Kiểm tra xem bản đồ 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).