Java WeakHashMap案例詳解
WeakHashMap 繼承于AbstractMap,實(shí)現(xiàn)了Map接口。
和HashMap一樣,WeakHashMap 也是一個(gè)散列表,它存儲(chǔ)的內(nèi)容也是鍵值對(duì)(key-value)映射,而且鍵和值都可以是null。
不過WeakHashMap的鍵是“弱鍵”。在 WeakHashMap 中,當(dāng)某個(gè)鍵不再正常使用時(shí),會(huì)被從WeakHashMap中被自動(dòng)移除。更精確地說,對(duì)于一個(gè)給定的鍵,其映射的存在并不阻止垃圾回收器對(duì)該鍵的丟棄,這就使該鍵成為可終止的,被終止,然后被回收。某個(gè)鍵被終止時(shí),它對(duì)應(yīng)的鍵值對(duì)也就從映射中有效地移除了。
這個(gè)“弱鍵”的原理呢?大致上就是,通過WeakReference和ReferenceQueue實(shí)現(xiàn)的。 WeakHashMap的key是“弱鍵”,即是WeakReference類型的;ReferenceQueue是一個(gè)隊(duì)列,它會(huì)保存被GC回收的“弱鍵”。實(shí)現(xiàn)步驟是:
- 新建WeakHashMap,將“鍵值對(duì)”添加到WeakHashMap中。實(shí)際上,WeakHashMap是通過數(shù)組table保存Entry(鍵值對(duì));每一個(gè)Entry實(shí)際上是一個(gè)單向鏈表,即Entry是鍵值對(duì)鏈表。
- 當(dāng)某“弱鍵”不再被其它對(duì)象引用,并被GC回收時(shí)。在GC回收該“弱鍵”時(shí),這個(gè)“弱鍵”也同時(shí)會(huì)被添加到ReferenceQueue(queue)隊(duì)列中。
- (03) 當(dāng)下一次我們需要操作WeakHashMap時(shí),會(huì)先同步table和queue。table中保存了全部的鍵值對(duì),而queue中保存被GC回收的鍵值對(duì);同步它們,就是刪除table中被GC回收的鍵值對(duì)。這就是“弱鍵”如何被自動(dòng)從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 map
private 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);}
就是對(duì)傳入的map進(jìn)行了簡(jiǎn)單的包裝
到此這篇關(guān)于Java WeakHashMap案例詳解的文章就介紹到這了,更多相關(guān)Java WeakHashMap內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot通過token實(shí)現(xiàn)用戶互踢功能(具體實(shí)現(xiàn))
所謂token,既用戶能夠在一定時(shí)間內(nèi)證明自己身份的一長(zhǎng)串字符串,這篇文章主要介紹了SpringBoot通過token實(shí)現(xiàn)用戶互踢功能,需要的朋友可以參考下2024-04-04
Java編程實(shí)現(xiàn)基于圖的深度優(yōu)先搜索和廣度優(yōu)先搜索完整代碼
這篇文章主要介紹了Java編程實(shí)現(xiàn)基于圖的深度優(yōu)先搜索和廣度優(yōu)先搜索完整代碼,具有一定借鑒價(jià)值,需要的朋友可以了解下。2017-12-12
Java變量的初始化及靜態(tài)方法的實(shí)現(xiàn)
這篇文章主要介紹了Java變量的初始化及靜態(tài)方法的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Java創(chuàng)建型設(shè)計(jì)模式之建造者模式詳解
建造者模式是Java中一種創(chuàng)建型設(shè)計(jì)模式,它的主要目的是將一個(gè)復(fù)雜對(duì)象的構(gòu)建過程分解為多個(gè)簡(jiǎn)單對(duì)象的構(gòu)建過程,本文將詳細(xì)介紹Java中的建造者模式,包括它的定義、結(jié)構(gòu)、實(shí)現(xiàn)方法以及應(yīng)用場(chǎng)景等方面,希望對(duì)大家有所幫助2023-05-05
SpringBoot實(shí)現(xiàn)RabbitMQ三種使用方式
本文主要介紹了SpringBoot實(shí)現(xiàn)RabbitMQ三種使用方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Java實(shí)現(xiàn)天天酷跑小游戲完整代碼(附源碼)
這篇文章主要介紹了使用Java實(shí)現(xiàn)天天酷跑(附源碼),本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12

