3

當已有其他實現可用時,需要引入弱哈希映射。當有HashMap和Concurrent HashMap時,WeakHashMap的目的是什麼?

總之,我有兩個問題:

  • Why jdk has WeakHashMap when there is HashMap and Concurrent HashMap in java ?

  • What is the use of it in real life applications ?

編輯:

雖然WeakHashMap的關鍵是一個弱引用,但他們仍然是指 東西比在WeakHashMap中憑什麼GC丟棄鍵。

+1

文檔(http://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html) –

+0

它規定了什麼是HashMap的不是我的問題:( – Prateek

+1

我沒」我試圖回答這個問題,我發佈的這一點更多的是讓我們休息*知道你指的是什麼 –

回答

0

您可以使用對象作爲關鍵點而不阻止其收集。

WeakHashMap documentation

當一個鍵已經被丟棄的條目被有效地從地圖上刪除,因此該類從其他Map實現的行爲有所不同。特別是在WeakReferences和WeakHashMaps的

4

一個常見用途是用於 添加屬性的對象。有時你想添加一些 功能或數據的對象,但子類和/或組合 不是一種選擇在這種情況下,明顯的事情要做的是 創建一個鏈接你想擴展的對象的屬性 你想添加。那麼無論何時您需要該物業,您都可以在地圖上查看 。但是,如果要添加屬性 的對象往往被摧毀,並創造了很多,你可以用很多地圖 舊物佔用了大量的內存

如果使用WeakHashMap中,而不是結束物體將不再使用其他程序,即 所需的行爲,因此對象將盡快將其保留爲 。

WeakHashMap的關鍵是弱引用。如果密鑰已被垃圾收集,則WeakHashMap對象中的條目將被自動刪除。這在正常的HashMap中不會發生。如果密鑰被垃圾收集,則條目不會被刪除。

在這個例子中,我採取了一個HashMap和一個WeakHashMap。我將把條目放入對象中,然後我們將把參考關鍵字設爲null,然後進行垃圾收集。再次檢查輸入。在HashMap對象條目將在那裏,但在WeakHashMap對象不會有條目存在。

import java.util.HashMap; 
import java.util.Map; 
import java.util.WeakHashMap; 

public class WeakHashMapTest { 
    public static void main(String[] args) { 
     Map hashMap= new HashMap(); 

     Map weakHashMap = new WeakHashMap(); 

     String keyHashMap = new String("keyHashMap"); 
     String keyWeakHashMap = new String("keyWeakHashMap"); 

     hashMap.put(keyHashMap, "Ankita"); 
     weakHashMap.put(keyWeakHashMap, "Atul"); 
     System.gc(); 
     System.out.println("Before: hash map value:"+hashMap.get("keyHashMap")+" and weak hash map value:"+weakHashMap.get("keyWeakHashMap")); 

     keyHashMap = null; 
     keyWeakHashMap = null; 

     System.gc(); 

     System.out.println("After: hash map value:"+hashMap.get("keyHashMap")+" and weak hash map value:"+weakHashMap.get("keyWeakHashMap")); 
    } 
} 

輸出將是:

Before: hash map value:Ankita and weak hash map value:Atul 
After: hash map value:Ankita and weak hash map value:null 

更多信息:

+0

+1,也代碼參考:http://www.concretepage.com/java/example_weakhashmap.php –

1

不像正常的集合s,它保存數據,直到您決定清除它爲止,WeakHashMap中的數據可能會在任何時間點被刪除,而JVM在決定是否需要恢復內存時不會另行通知。這使它適用於各種緩存目的。

你可以在弱引用(以及其他各種相關類型)here

1

首先讀了你應該明白的WeakReferences目的。一旦你明白,然後讀取從文檔的WeakedHashMap定義清楚地告訴它的目的

基於哈希表的以弱鍵Map實現。 WeakHashMap中的條目將被自動刪除,當其密鑰不再處於 的普通使用狀態時。更確切地說,對於給定的密鑰的映射的存在不會阻止密鑰被垃圾收集器丟棄,也就是說,可以終結,完成並且然後回收。 當一個密鑰被丟棄時,它的入口被有效地從 中刪除,所以這個類的行爲與其他的地圖 的實現有些不同。

0

它們提供了一種使用對象作爲關鍵字而不創建強引用的方法。這是一種很好的做法,您不希望阻礙JVM垃圾收集對象的能力,但仍然希望能夠跟蹤對象的某些方面。這使它們成爲緩存或存儲關於對象的元數據的理想選擇。

0

從答案中,唯一的緩存功能是在GC上自動逐出,它可能不會在年輕的gen GC期間發生,但在持久老gen GC中用於緩存某些時間使用的大型文件的用例。該條目是否在任何GC上被驅逐,或者只有當終身代滿後?

除了不可預測的驅逐之外,沒有可以在地圖上指定的大小限制,因此具有預定義的高速緩存大小(元素和內存大小數量)以及驅逐策略的任何高速緩存庫對我來說似乎都是更好的選擇因爲大多數緩存還包括一個規定,以在堆使用超過一定大小時減少大小/刷新更多元素。這些還提供了併發性的一致性。

所以,我不知道是否有一個很好的使用案例,除了由於糟糕的設計而導致內存泄漏和錯過命中的風險之外。在[WeakHashMap中]