Java - IdentityHashMap 類別

介紹

你好,未來的 Java 開發者!今天,我們將進入 Java 的 IdentityHashMap 類別的精彩世界。我知道你可能在想:"又一個地圖類別?我們不是剛學過 HashMap 嗎?"好吧,你說得對,但請相信我,IdentityHashMap 有它獨特的風味,使它變得特別。讓我們一起深入探討!

Java - The IdentityHashMap Class

類別聲明

首先,讓我們看看如何聲明一個 IdentityHashMap:

import java.util.IdentityHashMap;

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

這行程式碼創建了一個新的 IdentityHashMap,用於存儲 String 鍵和 Integer 值。但它與普通的 HashMap 有何不同?好吧,這就是事情變得有趣的地方!

類別構造器

IdentityHashMap 有四個構造器。讓我們來分解它們:

  1. 預設構造器:

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

    這會創建一個空的 IdentityHashMap,其默認容量為 21。

  2. 構造器帶有初始容量:

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

    這會創建一個空的 IdentityHashMap,並指定初始容量。

  3. 構造器帶有另一個 Map:

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

    這會創建一個 IdentityHashMap,其中包含與指定 Map 相同的映射。

  4. 構造器帶有預期最大大小:

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

    這會創建一個空的 IdentityHashMap,並指定預期的最大大小和負載因子。

類別方法

現在,讓我們看看 IdentityHashMap 中一些最常用的方法:

方法 描述
put(K key, V value) 將指定的值與指定的鍵相關聯
get(Object key) 返回指定鍵映射到的值
remove(Object key) 如果存在,則刪除此鍵的映射
clear() 從此地圖中刪除所有映射
size() 返回此地圖中的鍵值映射數量
isEmpty() 如果此地圖不包含任何鍵值映射,則返回 true
containsKey(Object key) 如果此地圖包含指定鍵的映射,則返回 true
containsValue(Object value) 如果此地圖將一個或多個鍵映射到指定值,則返回 true

讓我們看看這些方法是如何工作的:

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

// 添加鍵值對
ages.put("Alice", 25);
ages.put("Bob", 30);

// 獲取一個值
System.out.println("Alice 的年齡: " + ages.get("Alice")); // 輸出:Alice 的年齡: 25

// 檢查一個鍵是否存在
System.out.println("Charlie 存在嗎? " + ages.containsKey("Charlie")); // 輸出:Charlie 存在嗎? false

// 刪除一個鍵值對
ages.remove("Bob");

// 檢查大小
System.out.println("條目數量: " + ages.size()); // 輸出:條目數量: 1

繼承的方法

IdentityHashMap 繼承了其超類和接口的方法。以下是一些示例:

繼承自 方法
java.util.AbstractMap clone(), equals(), hashCode(), toString()
java.util.Map entrySet(), keySet(), values()
java.lang.Object finalize(), getClass(), notify(), notifyAll(), wait()

在 IdentityHashMap 中添加鍵值映射的示例

現在,讓我們深入了解使 IdentityHashMap 變得特別之處。與 HashMap 不同,HashMap 使用 equals() 方法比較鍵,而 IdentityHashMap 使用參考等價性 (==)。這意味著只有當兩個鍵是記憶體中完全相同的對象時,才會被視為等價。

讓我們看看這是如何實現的:

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("IdentityHashMap 的大小: " + identityMap.size());
System.out.println("key1 的值: " + identityMap.get(key1));
System.out.println("key2 的值: " + identityMap.get(key2));

輸出:

IdentityHashMap 的大小: 2
key1 的值: World1
key2 的值: World2

感到驚訝嗎?即使 key1 和 key2 具有相同的內容("Hello"),IdentityHashMap 將它們視為不同的鍵,因為它們是記憶體中不同的 String 對象。

在特定情況下,此行為可能非常有用。例如,想像你正在编写一個程序來跟蹤文件的不同版本。每個版本可能具有相同的標題,但你希望將它們視為獨立的實體。IdentityHashMap 對此將是完美的選擇!

總結來說,IdentityHashMap 像是 Map 家族中的古怪表親。它看起來與其他成員相似,但它有自己的獨特之處。了解何時使用它可以使你成為一個更加多才多藝的 Java 程式設計師。

記住,在編程的世界中,沒有適用於所有情況的解决方案。每個工具都有其適用的場合,知道何時使用 IdentityHashMap 是你 Java 知識庫中的另一支箭。持續練習,保持好奇心,並編程愉快!

Credits: Image by storyset