Java - Lớp IdentityHashMap

Giới thiệu

Xin chào các bạn, những nhà phát triển Java tương lai! Hôm nay, chúng ta sẽ bắt đầu hành trình thú vị vào thế giới của lớp IdentityHashMap trong Java. Tôi biết bạn có thể đang suy nghĩ: "Một lớp map nữa sao? Chúng ta vừa học về HashMap chưa?" Đúng là, bạn có đúng, nhưng hãy tin tôi, IdentityHashMap có sự đặc biệt riêng của mình khiến nó trở nên đặc biệt. Hãy bắt đầu điều tra nào!

Java - The IdentityHashMap Class

Khai báo lớp

Trước tiên, hãy xem cách chúng ta khai báo một IdentityHashMap:

import java.util.IdentityHashMap;

IdentityHashMap<String, Integer> myMap = new IdentityHashMap<>();

Dòng mã này tạo một IdentityHashMap mới để lưu trữ các khóa String và các giá trị Integer. Nhưng điều gì khiến nó khác biệt so với một HashMap bình thường? Đó là nơi điều gì đó trở nên thú vị!

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

IdentityHashMap đi kèm với bốn hàm khởi tạo. Hãy phân tích chúng:

  1. Hàm khởi tạo mặc định:

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

    Điều này tạo một IdentityHashMap trống với khả năng mặc định là 21.

  2. Hàm khởi tạo với khả năng ban đầu:

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

    Điều này tạo một IdentityHashMap trống với khả năng ban đầu đã chỉ định.

  3. Hàm khởi tạo với một Map khác:

    Map<String, Integer> existingMap = new HashMap<>();
    IdentityHashMap<String, Integer> map3 = new IdentityHashMap<>(existingMap);

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

  4. Hàm khởi tạo với kích thước tối đa mong đợi:

    IdentityHashMap<String, Integer> map4 = new IdentityHashMap<>(100, 0.75f);

    Điều này tạo một IdentityHashMap trống với kích thước tối đa mong đợi và tỷ lệ tải đã chỉ định.

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

Bây giờ, hãy xem một số phương thức thường được sử dụng trong IdentityHashMap:

Phương thức Mô tả
put(K key, V value) Kết hợp giá trị đã chỉ định với khóa đã chỉ định
get(Object key) Trả về giá trị mà khóa đã chỉ định được ánh xạ
remove(Object key) Xóa ánh xạ cho khóa này nếu có
clear() Xóa tất cả các ánh xạ khỏi bản đồ này
size() Trả về số lượng các ánh xạ khóa-giá trị trong bản đồ này
isEmpty() Trả về true nếu bản đồ này không chứa các ánh xạ khóa-giá trị
containsKey(Object key) Trả về true nếu bản đồ này chứa ánh xạ cho khóa đã chỉ định
containsValue(Object value) Trả về true nếu bản đồ này ánh xạ một hoặc nhiều khóa đến giá trị đã chỉ định

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

IdentityHashMap<String, Integer> ages = new IdentityHashMap<>();

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

// Lấy giá trị
System.out.println("Tuổi của Alice: " + ages.get("Alice")); // Output: Tuổi của Alice: 25

// Kiểm tra xem khóa có tồn tại hay không
System.out.println("Charlie có tồn tại không? " + ages.containsKey("Charlie")); // Output: Charlie có tồn tại không? false

// Xóa một cặp khóa-giá trị
ages.remove("Bob");

// Kiểm tra kích thước
System.out.println("Số lượng mục: " + ages.size()); // Output: Số lượng mục: 1

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

IdentityHashMap kế thừa các phương thức từ các lớp cha và giao diện của nó. Dưới đây là một số của chúng:

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 ánh xạ khóa-giá trị trong IdentityHashMap

Bây giờ, hãy đi sâu vào điều gì khiến IdentityHashMap trở nên đặc biệt. Không giống như HashMap, nó sử dụng phương thức equals() để so sánh các khóa, IdentityHashMap sử dụng sự đồng nhất tham chiếu (==). Điều này có nghĩa là hai khóa được coi là bằng nhau chỉ khi chúng là cùng một đối tượng trong bộ nhớ.

Hãy xem điều này hoạt động:

IdentityHashMap<String, String> identityMap = new IdentityHashMap<>();

String key1 = new String("Hello");
String key2 = new String("Hello");

identityMap.put(key1, "World1");
identityMap.put(key2, "World2");

System.out.println("Kích thước của IdentityHashMap: " + identityMap.size());
System.out.println("Giá trị cho key1: " + identityMap.get(key1));
System.out.println("Giá trị cho key2: " + identityMap.get(key2));

Output:

Kích thước của IdentityHashMap: 2
Giá trị cho key1: World1
Giá trị cho key2: World2

Ngạc nhiên phải không? Mặc dù key1 và key2 có cùng nội dung ("Hello"), IdentityHashMap xử lý chúng như các khóa khác nhau vì chúng là các đối tượng String khác nhau trong bộ nhớ.

Hành vi này có thể rất hữu ích trong một số tình huống cụ thể. Ví dụ, tưởng tượng bạn đang viết một chương trình theo dõi các phiên bản khác nhau của một tài liệu. Mỗi phiên bản có thể có cùng tiêu đề, nhưng bạn muốn xử lý chúng như các thực thể riêng biệt. IdentityHashMap sẽ là lựa chọn hoàn hảo!

Tóm lại, IdentityHashMap giống như là người anh chị em lạc quan trong gia đình Map. Nó trông giống như những người khác, nhưng có cách riêng của mình để làm việc. Hiểu khi nào nên sử dụng nó có thể khiến bạn trở thành một nhà phát triển Java linh hoạt hơn.

Hãy nhớ, trong thế giới lập trình, không có giải pháp một kích thước phù hợp cho tất cả. Mỗi công cụ có vị trí của riêng, và biết khi nào nên sử dụng IdentityHashMap là một mũi tên thêm vào vũ khí kiến thức Java của bạn. Hãy tiếp tục tập luyện, giữ được sự tò mò và hạnh phúc mã hóa!

Credits: Image by storyset