Java WeakHashMap案例詳解
WeakHashMap 繼承于AbstractMap,實(shí)現(xiàn)了Map接口。和HashMap一樣,WeakHashMap 也是一個(gè)散列表,它存儲的內(nèi)容也是鍵值對(key-value)映射,而且鍵和值都可以是null。不過WeakHashMap的鍵是“弱鍵”。在 WeakHashMap 中,當(dāng)某個(gè)鍵不再正常使用時(shí),會被從WeakHashMap中被自動移除。更精確地說,對于一個(gè)給定的鍵,其映射的存在并不阻止垃圾回收器對該鍵的丟棄,這就使該鍵成為可終止的,被終止,然后被回收。某個(gè)鍵被終止時(shí),它對應(yīng)的鍵值對也就從映射中有效地移除了。這個(gè)“弱鍵”的原理呢?大致上就是,通過WeakReference和ReferenceQueue實(shí)現(xiàn)的。 WeakHashMap的key是“弱鍵”,即是WeakReference類型的;ReferenceQueue是一個(gè)隊(duì)列,它會保存被GC回收的“弱鍵”。實(shí)現(xiàn)步驟是:(01) 新建WeakHashMap,將“鍵值對”添加到WeakHashMap中。實(shí)際上,WeakHashMap是通過數(shù)組table保存Entry(鍵值對);每一個(gè)Entry實(shí)際上是一個(gè)單向鏈表,即Entry是鍵值對鏈表。(02) 當(dāng)某“弱鍵”不再被其它對象引用,并被GC回收時(shí)。在GC回收該“弱鍵”時(shí),這個(gè)“弱鍵”也同時(shí)會被添加到ReferenceQueue(queue)隊(duì)列中。(03) 當(dāng)下一次我們需要操作WeakHashMap時(shí),會先同步table和queue。table中保存了全部的鍵值對,而queue中保存被GC回收的鍵值對;同步它們,就是刪除table中被GC回收的鍵值對。這就是“弱鍵”如何被自動從WeakHashMap中刪除的步驟了。
和HashMap一樣,WeakHashMap是不同步的。可以使用 Collections.synchronizedMap 方法來構(gòu)造同步的 WeakHashMap
既然有WeakHashMap,那么有WeakHashSet嗎? java collections包是沒有直接提供WeakHashSet的。
我們可以通過Collections.newSetFromMap(Map<E,Boolean> map)方法可以將任何 Map包裝成一個(gè)Set。源碼如下:
public static <E> Set<E> newSetFromMap(Map<E, Boolean> map) {return new SetFromMap<>(map); } /** * @serial include */ private static class SetFromMap<E> extends AbstractSet<E>implements Set<E>, Serializable {private final Map<E, Boolean> m; // The backing mapprivate transient Set<E> s; // Its keySet SetFromMap(Map<E, Boolean> map) { if (!map.isEmpty())throw new IllegalArgumentException('Map is non-empty'); m = map; s = map.keySet();} public void clear() {m.clear(); }public int size() { return m.size(); }public boolean isEmpty() { return m.isEmpty(); }public boolean contains(Object o) { return m.containsKey(o); }public boolean remove(Object o) { return m.remove(o) != null; }public boolean add(E e) { return m.put(e, Boolean.TRUE) == null; }public Iterator<E> iterator() { return s.iterator(); }public Object[] toArray() { return s.toArray(); }public <T> T[] toArray(T[] a) { return s.toArray(a); }public String toString() { return s.toString(); }public int hashCode() { return s.hashCode(); }public boolean equals(Object o) { return o == this || s.equals(o); }public boolean containsAll(Collection<?> c) {return s.containsAll(c);}public boolean removeAll(Collection<?> c) {return s.removeAll(c);}public boolean retainAll(Collection<?> c) {return s.retainAll(c);}
就是對傳入的map進(jìn)行了簡單的包裝
到此這篇關(guān)于Java WeakHashMap案例詳解的文章就介紹到這了,更多相關(guān)Java WeakHashMap內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. Python安裝并操作redis實(shí)現(xiàn)流程詳解2. 部署vue+Springboot前后端分離項(xiàng)目的步驟實(shí)現(xiàn)3. Django如何使用asyncio協(xié)程和ThreadPoolExecutor多線程4. 如何用 Python 制作一個(gè)迷宮游戲5. AJAX實(shí)現(xiàn)數(shù)據(jù)的增刪改查操作詳解【java后臺】6. vue組件庫的在線主題編輯器的實(shí)現(xiàn)思路7. AspNetCore&MassTransit Courier實(shí)現(xiàn)分布式事務(wù)的詳細(xì)過程8. django實(shí)現(xiàn)模型字段動態(tài)choice的操作9. ASP基礎(chǔ)入門第八篇(ASP內(nèi)建對象Application和Session)10. ASP基礎(chǔ)入門第三篇(ASP腳本基礎(chǔ))
