歡迎訪問昆山寶鼎軟件有限公司網站! 設為首頁 | 網站地圖 | XML | RSS訂閱 | 寶鼎郵箱 | 后臺管理
?

新聞資訊

MENU

軟件開發知識

Java 中的 勞務派遣管理系統 WeakHashMap

點擊: 次  來源:勞務派遣管理系統 時間:2017-11-16

原文出處: 阿杜

本日一起來看下java.util包里的WeakHashMap東西類。

WeakHashMap的界說如下:

public class WeakHashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>

簡樸來說,WeakHashMap實現了Map接口,基于hash-table實現,在這種Map中,昆山軟件開發,key的范例是WeakReference。假如對應的key被接納,則這個key指向的工具會被從Map容器中移除。

WeakHashMap跟普通的HashMap差異,WeakHashMap的行為必然水平上基于垃圾收集器的行為,因此一些Map數據布局對應的知識在WeakHashMap上會失效——size()要領的返回值會跟著措施的運行變小,isEmpty()要領的返回值會從false釀成true等等。

強引用、軟引用和弱引用

“引用”,在Java中指的是一個工具對另一工具的利用(指向)。WeakHashMap中的鍵的范例是WeakReference,在Java中尚有別的兩種引用:強引用(Strong Reference)、軟引用(Soft Reference)。

強引用

被強引用指向的工具,絕對不會被垃圾收集器接納。Integer prime = 1;,這個語句中prime工具就有一個強引用。

軟引用

被SoftReference指向的工具大概會被垃圾收集器接納,可是只有在JVM內存不足的環境下才會接納;如下代碼可以建設一個軟引用:

Integer prime = 1;  
SoftReference<Integer> soft = new SoftReference<Integer>(prime);
prime = null;

弱引用

當一個工具僅僅被WeakReference引用時,在下個垃圾收集周期時候該工具就會被接納。我們通過下面代碼建設一個WeakReference

Integer prime = 1;  
WeakReference<Integer> soft = new WeakReference<Integer>(prime);
prime = null;

當把prime賦值為null的時候,原prime工具會在下一個垃圾收集周期中被接納,因為已經沒有強引用指向它。

操作WeakHashMap實現內存緩存

可以看出,WeakHashMap的這種特性較量適合實現雷同當地、堆內緩存的存儲機制——緩存的失效依賴于GC收集器的行為。假設一種應用場景:我們需要生存一批大的圖片工具,個中values是圖片的內容,key是圖片的名字,這里我們需要選擇一種符合的容器生存這些工具。

利用普通的HashMap并不是好的選擇,這些大工具將會占用許多內存,而且還不會被GC接納,昆山軟件開發,除非我們在對應的key廢棄之前主動remove掉這些元素。WeakHashMap很是適合利用在這種場景下,下面的代碼演示了詳細的實現:

WeakHashMap<UniqueImageName, BigImage> map = new WeakHashMap<>();
BigImage bigImage = new BigImage("image_id");
UniqueImageName imageName = new UniqueImageName("name_of_big_image"); //強引用

map.put(imageName, bigImage);
assertTrue(map.containsKey(imageName));

imageName = null; //map中的values工具成為弱引用工具
System.gc(); //主動觸發一次GC

await().atMost(10, TimeUnit.SECONDS).until(map::isEmpty);

首先,建設一個WeakHashMap工具來存儲BigImage實例,對應的key是UniqueImageName工具,生存到WeakHashMap里的時候,key是一個弱引用范例。

然后,我們將imageName配置為null,這樣就沒有其他強引用指向bigImage工具,憑據WeakHashMap的法則,在下一次GC周期中會接納bigImage工具。

通過System.gc()主動觸發一次GC進程,勞務派遣管理系統,然后可以發明WeakHashMap成為空的了。

總結

本文從WeakHashMap的界說講起,又通過先容Java中的三種引用范例來領略WeakHashMap的事情道理,最后操作一個存儲大工具的例子演示了WeakHashMap的應用場景。本文中提到的代碼,可以在GitHub工程看到。

參考資料

  1. Weak references – how useful are they?
  2. Guide to WeakHashMap in Java
排列三305组选前后关系 精确排列五预测 山西快乐10分计划 股票分析师工资多少 河南11选5中奖结果 北京十一选五往期 短线股票贴吧 江苏11选5一天开多少期 期货开户哪个公司好 快乐十分app 11选5胆码拖码奖金图