Pra*_*eek 4 java hashmap concurrenthashmap java.util.concurrent weakhashmap
当已经有其他实现可用时,还需要引入 Weak HashMap 吗?
简而言之,我有两个问题:
Why jdk has WeakHashMap when there is HashMap and Concurrent HashMap in java ?
What is the use of it in real life applications ?
编辑 :
虽然 WeakHashmap key 是弱引用,但它们仍然引用了一些东西,而不是 GC 在 WeakHashMap 中丢弃键的依据。
WeakReferences 和 WeakHashMap 的一种常见用途是向对象添加属性。有时您想要向对象添加一些功能或数据,但子类化和/或组合不是一个选项,在这种情况下,显而易见的做法是创建一个哈希图,将您想要扩展的对象链接到您想要添加的属性。然后每当您需要该房产时,您只需在地图上查找即可。但是,如果您添加属性的对象往往会被大量销毁和创建,则最终可能会在地图中出现大量旧对象,从而占用大量内存
如果您使用 WeakHashMap,则一旦程序的其余部分不再使用对象,它们就会离开您的映射,这是所需的行为。
a 的键WeakHashMap
具有弱引用。如果该键已被垃圾回收,则WeakHashMap
对象中的条目将自动删除。正常情况下不会发生这种情况HashMap
。如果该键被垃圾回收,则该条目不会被删除。
在示例中,我采用了 1HashMap
和 1 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"));
}
}
Run Code Online (Sandbox Code Playgroud)
输出将是:
Before: hash map value:Ankita and weak hash map value:Atul
After: hash map value:Ankita and weak hash map value:null
Run Code Online (Sandbox Code Playgroud)
更多信息:
归档时间: |
|
查看次数: |
4810 次 |
最近记录: |