1. 程式人生 > >Java 集合系列14之 Map總結

Java 集合系列14之 Map總結

code 程序 目的 例如 ring 朋友 就是 redis kafka

(01) 新建WeakHashMap,將“鍵值對”添加到WeakHashMap中。

將“鍵值對”添加到WeakHashMap中時,添加的鍵都是弱鍵。

實際上,WeakHashMap是通過數組table保存Entry(鍵值對);每一個Entry實際上是一個單向鏈表,即Entry是鍵值對鏈表。

(02) 當某“弱鍵”不再被其它對象引用,並被GC回收時。在GC回收該“弱鍵”時,這個“弱鍵”也同時會被添加到queue隊列中。

例如,當我們在將“弱鍵”key添加到WeakHashMap之後;後來將key設為null。這時,便沒有外部外部對象再引用該了key。

接著,當Java虛擬機的GC回收內存時,會回收key的相關內存;同時,將key添加到queue隊列中。

(03) 當下一次我們需要操作WeakHashMap時,會先同步table和queue。table中保存了全部的鍵值對,而queue中保存被GC回收的“弱鍵”;同步它們,就是刪除table中被GC回收的“弱鍵”對應的鍵值對。

例如,當我們“讀取WeakHashMap中的元素或獲取WeakReference的大小時”,它會先同步table和queue,目的是“刪除table中被GC回收的‘弱鍵’對應的鍵值對”。刪除的方法就是逐個比較“table中元素的‘鍵’和queue中的‘鍵’”,若它們相當,則刪除“table中的該鍵值對”。

3.3 HashMap和WeakHashMap的比較測試程序

Java 集合系列14之 Map總結

View Code

運行結果:

Java 集合系列14之 Map總結
-- HashMap --
map entry : H2 - h2
map size:1
-- WeakHashMap --
map entry : W2 - w2
map size:1
-- Self-def HashMap --
map entry : [email protected] - s4
map size:1
-- Self-def WeakHashMap --
GC Self: id=10 [email protected])
map entry : [email protected] - s2
map size:1

Java 集合系列14之 Map總結
歡迎工作一到五年的Java工程師朋友們加入Java架構師:697558955

群內提供免費的Java架構學習資料(裏面有高可用、高並發、高性能及分布式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!

Java 集合系列14之 Map總結