【轉】Java 集合框架之 WeakHashMap 和 IdentityHashMap 介紹
WeakHashMap
WeakHashMap 繼承於AbstractMap,實現了Map介面。
和HashMap一樣,WeakHashMap 也是一個散列表,它儲存的內容也是鍵值對(key-value)對映,而且鍵和值都可以是null。
不過WeakHashMap的鍵是“弱鍵”。在 WeakHashMap 中,當某個鍵不再正常使用時,會被從WeakHashMap中被自動移除。更精確地說,對於一個給定的鍵,其對映的存在並不阻止垃圾回收器對該鍵的丟棄,這就使該鍵成為可終止的,被終止,然後被回收。某個鍵被終止時,它對應的鍵值對也就從對映中有效地移除了。
這個“弱鍵”的原理呢?大致上就是,通過WeakReference和ReferenceQueue實現的
(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的這個特點,那麼在使用時需要小心。看一個例子:
- IdentityHashMap<String, String> identityHashMap = new IdentityHashMap();
- String s1 = new String("key");
- String s2 = new String("key");
- identityHashMap.put(s1,"value");
- identityHashMap.put(s2,"value1");
-
- System.out.println(identityHashMap.get("key"));
- System.out.println(identityHashMap);
輸出:
- null
- {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/ 本文版權歸作者和部落格園共有,轉載必須給出原文連結,並保留此段宣告,否則保留追究法律責任的權利。