Java WeakHashMap 類別:初學者指南

介紹

你好,未來的 Java 程式設計師!今天,我們將深入 Java 的 WeakHashMap 的迷人世界。如果你以前從未聽過它,別擔心——我們將從頭開始,逐步學習。在這篇教程結束時,你將成為 WeakHashMap 的專家!

Java - WeakHashMap

什么是 WeakHashMap?

想像一下,你正在組織一個大型派對,並且有一個賓客名單。但這不是一個普通的賓客名單——這是一個神奇的 list,會自動刪除不能參加的人。這就是 WeakHashMap 在 Java 中的功能,不過用的是物件而不是派對賓客!

WeakHashMap 是 Java 中的一種特殊 Map,當其鍵在程式的其他地方不再使用時,允許這些鍵被垃圾回收。當你想創建一個不會阻止物件在不再需要時被清理的快取時,這可能非常有用。

類別聲明

讓我們先看看如何聲明一個 WeakHashMap:

import java.util.WeakHashMap;

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

在這個例子中,我們創建了一個使用 String 物件作為鍵和 Integer 物件作為值的 WeakHashMap。<String, Integer>部分稱為“泛型”——這就像告訴 Java 我們想在 map 中存儲什麼類型的物件。

類別構造器

WeakHashMap 有四個不同的構造器。讓我們看看每一個:

  1. 預設構造器:

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

    這會創建一個空的 WeakHashMap,具有預設的初始容量(16)和負載因子(0.75)。

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

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

    這會創建一個具有指定初始容量和預設負載因子的 WeakHashMap。

  3. 帶有初始容量和負載因子的構造器:

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

    這會創建一個具有指定初始容量和負載因子的 WeakHashMap。

  4. 帶有另一個 Map 的構造器:

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

    這會創建一個與指定 map 有相同映射的 WeakHashMap。

類別方法

WeakHashMap 提供了多種方法來操作和訪問其內容。以下是一些最常使用的方法的表格:

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

讓我們看看其中一些方法的實際應用:

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

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

// 檢索一個值
System.out.println("Alice 的年齡: " + ageMap.get("Alice")); // 輸出:Alice 的年齡: 25

// 檢查一個鍵是否存在
System.out.println("地圖中是否有 David? " + ageMap.containsKey("David")); // 輸出:地圖中是否有 David? false

// 刪除一個鍵值對
ageMap.remove("Bob");
System.out.println("刪除 Bob 後的地圖大小: " + ageMap.size()); // 輸出:刪除 Bob 後的地圖大小: 2

// 清除地圖
ageMap.clear();
System.out.println("地圖是否為空? " + ageMap.isEmpty()); // 輸出:地圖是否為空? true

繼承的方法

WeakHashMap 繼承了其父類別和介面的一些方法。以下是一些重要的繼承方法:

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

將鍵值對添加到 Integer、Integer 對的 WeakHashMap 示例

現在,讓我們看一下使用 Integer 鍵和值的 WeakHashMap 的更完整示例:

import java.util.WeakHashMap;

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

// 添加鍵值對
for (int i = 1; i <= 5; i++) {
squareMap.put(i, i * i);
}

System.out.println("初始地圖: " + squareMap);

// 訪問值
System.out.println("3 的平方: " + squareMap.get(3));

// 刪除一個鍵值對
squareMap.remove(2);
System.out.println("刪除 2 後的地圖: " + squareMap);

// 檢查一個鍵是否存在
System.out.println("地圖中是否包含 4? " + squareMap.containsKey(4));

// 檢查一個值是否存在
System.out.println("地圖中是否包含值 16? " + squareMap.containsValue(16));

// 迭代地圖
System.out.println("迭代地圖:");
for (Integer key : squareMap.keySet()) {
System.out.println("鍵: " + key + ", 值: " + squareMap.get(key));
}
}
}

輸出

運行此代碼時,你將看到類似以下的輸出:

初始地圖: {5=25, 4=16, 3=9, 2=4, 1=1}
3 的平方: 9
刪除 2 後的地圖: {5=25, 4=16, 3=9, 1=1}
地圖中是否包含 4? true
地圖中是否包含值 16? true
迭代地圖:
鍵: 5, 值: 25
鍵: 4, 值: 16
鍵: 3, 值: 9
鍵: 1, 值: 1

以上就是!你剛剛已經踏出了 Java 的 WeakHashMap 世界的第一步。請記住,WeakHashMap 的真正威力在於它允許當鍵在程式的其他地方不再引用時被垃圾回收。在特定的情況下,這可能非常有用,例如實現快取或管理臨時數據。

在你继续 Java 的旅程中,你將發現越來越多的情況,WeakHashMap 可以成為你編程工具箱中的有價值工具。繼續練習,繼續探索,最重要的是,編程愉快!

Credits: Image by storyset