1. 程式人生 > 其它 >【轉】Java 集合框架之 WeakHashMap 和 IdentityHashMap 介紹

【轉】Java 集合框架之 WeakHashMap 和 IdentityHashMap 介紹

WeakHashMap

WeakHashMap 繼承於AbstractMap,實現了Map介面。
和HashMap一樣,WeakHashMap 也是一個散列表,它儲存的內容也是鍵值對(key-value)對映,而且鍵和值都可以是null
不過WeakHashMap的鍵是“弱鍵”。在 WeakHashMap 中,當某個鍵不再正常使用時,會被從WeakHashMap中被自動移除。更精確地說,對於一個給定的鍵,其對映的存在並不阻止垃圾回收器對該鍵的丟棄,這就使該鍵成為可終止的,被終止,然後被回收。某個鍵被終止時,它對應的鍵值對也就從對映中有效地移除了。
這個“弱鍵”的原理呢?大致上就是,通過WeakReference和ReferenceQueue實現的

。 WeakHashMap的key是“弱鍵”,即是WeakReference型別的;ReferenceQueue是一個佇列,它會儲存被GC回收的“弱鍵”。實現步驟是:
(01) 新建WeakHashMap,將“鍵值對”新增到WeakHashMap中。
實際上,WeakHashMap是通過陣列table儲存Entry(鍵值對);每一個Entry實際上是一個單向連結串列,即Entry是鍵值對連結串列。
(02) 當某“弱鍵”不再被其它物件引用,並被GC回收時。在GC回收該“弱鍵”時,這個“弱鍵”也同時會被新增到ReferenceQueue(queue)佇列中。
(03) 當下一次我們需要操作WeakHashMap時,會先同步table和queue。table中儲存了全部的鍵值對,而queue中儲存被GC回收的鍵值對;同步它們,就是刪除table中被GC回收的鍵值對

這就是“弱鍵”如何被自動從WeakHashMap中刪除的步驟了。

和HashMap一樣,WeakHashMap是不同步的。可以使用 Collections.synchronizedMap 方法來構造同步的 WeakHashMap

IdentityHashMap

            <div id="content_views" class="htmledit_views">
                <p>IdentityHashMap實現了Map介面,用法與HashMap差不多,都是用Hash表實現資料的儲存,比較key的值是否相等,如果相等就替換原有的值。</p> 

但是和hashmap最大的區別就是IdentityHash在比較key的時候使用的是”==“,也就是比較的是地址,而普通的hashmap在比較key的時候使用的是equals,如下方法:k1==null ? k2==null : k1.equals(k2)

也正是由於IdentityHashmap的這個特點,那麼在使用時需要小心。看一個例子:

  1. IdentityHashMap<String, String> identityHashMap = new IdentityHashMap();
  2. String s1 = new String("key");
  3. String s2 = new String("key");
  4. identityHashMap.put(s1,"value");
  5. identityHashMap.put(s2,"value1");
  6. System.out.println(identityHashMap.get("key"));
  7. System.out.println(identityHashMap);

輸出:

  1. null
  2. {key=value1,key=value}

s1、s2 都是new出來的,所以他們的地址肯定不同,在使用get方法傳遞引數時”key“是直接放到了常量池中,所以地址和s1、s2也不同,所以get的結果是null。

而程式碼中的"key"雖然值相同,但是它們的記憶體地址不同,所以可以同時存在IdentityHashmap中。

            <div id="content_views" class="htmledit_views">
                <p>本部落格所有內容來源於網路、書籍、和各類手冊。</p> 

內容旨為方便查詢、總結備份、開源分享。

部分轉載內容均有註明出處,如有侵權請告知,馬上刪除。

部分內容出處https://blog.csdn.net/qiuhao9527/article/details/80775524 https://blog.csdn.net/liuxiao723846/article/details/109328113 作者:Binge 出處:http://www.cnblogs.com/binbingg/ 本文版權歸作者和部落格園共有,轉載必須給出原文連結,並保留此段宣告,否則保留追究法律責任的權利。