- 簡述WeakHashMap的工作原理
弱鍵(Weak Keys):
WeakHashMap 的鍵(keys)是通過?WeakReference?弱引用進行封裝的。弱引用是一種特殊的引用類型,它不會阻止所引用的對象被垃圾收集器回收。這意味著,如果一個鍵對象除了作為 WeakHashMap 的鍵之外沒有任何強引用指向它,那么在進行垃圾回收時,這個鍵對象可以被當作垃圾回收,即使它還在 WeakHashMap 中。
鍵值對存儲:
WeakHashMap 內部采用類似于 HashMap 的數據結構來存儲鍵值對,即一個哈希表(數組加鏈表/紅黑樹)結構。每個鍵值對(Entry)被封裝在一個 Entry 對象中,其中鍵是通過?WeakReference?引用的,而值則是直接引用的。這樣設計使得值的生命周期不受鍵的影響,即使鍵被垃圾回收,只要還有其他強引用持有值,值本身不會被回收。
引用隊列(ReferenceQueue):
當 WeakHashMap 創建鍵值對時,不僅為鍵創建了一個?WeakReference,還將其關聯到一個?ReferenceQueue?上。當鍵對象因為沒有其他強引用而被垃圾收集器回收時,其對應的?WeakReference?將被添加到這個引用隊列中。
自動清理機制:
WeakHashMap 在進行諸如?get()、put()?等操作時,會檢查引用隊列中是否有被回收的鍵的?WeakReference。如果有,說明相應的鍵值對已經失去了鍵的引用,此時 WeakHashMap 會從內部哈希表中移除對應的 Entry,釋放相關資源。這個過程通常稱為“清理”或“整理”。
操作與同步:
與 HashMap 類似,WeakHashMap 的基本操作(如?put()、get()、remove())遵循類似的時間復雜度,即平均情況下接近 O(1),最壞情況下 O(n)。由于清理操作涉及到內部數據結構的修改,因此在多線程環境下,對 WeakHashMap 的操作通常需要適當的同步控制,盡管在 Java 8 及之后版本,JDK 提供了并發友好的?ConcurrentHashMap,但在某些特定場景下,開發者仍可能選擇使用 WeakHashMap 并自行管理同步。
?如果大家需要視頻版本的講解,歡迎關注我的B站: