我创建一个WeakHashMap为
WeakHashMap<Employee,String> map = new WeakHashMap<Employee,String>();
map.put(emp,"hello");
其中emp是Employee对象。现在,如果我执行emp = null或者说不再引用emp对象,那么是否将从WeakHashMap中删除该条目,即Map的大小是否为零?
对于HashMap,它会反过来吗?
我对WeakHashMap的理解是否正确?
答案 0 :(得分:39)
一个非常简单的例子,启发已经说过的话:
import java.util.WeakHashMap;
public class WeakHashMapDemo {
public static void main(String[] args) {
// -- Fill a weak hash map with one entry
WeakHashMap<Data, String> map = new WeakHashMap<Data, String>();
Data someDataObject = new Data("foo");
map.put(someDataObject, someDataObject.value);
System.out.println("map contains someDataObject ? " + map.containsKey(someDataObject));
// -- now make someDataObject elligible for garbage collection...
someDataObject = null;
for (int i = 0; i < 10000; i++) {
if (map.size() != 0) {
System.out.println("At iteration " + i + " the map still holds the reference on someDataObject");
} else {
System.out.println("somDataObject has finally been garbage collected at iteration " + i + ", hence the map is now empty");
break;
}
}
}
static class Data {
String value;
Data(String value) {
this.value = value;
}
}
}
输出:
map contains someDataObject ? true
...
At iteration 6216 the map still holds the reference on someDataObject
At iteration 6217 the map still holds the reference on someDataObject
At iteration 6218 the map still holds the reference on someDataObject
somDataObject has finally been garbage collected at iteration 6219, hence the map is now empty
答案 1 :(得分:9)
我运行了示例代码,以了解HashMap
和WeakHashMap
Map hashMap= new HashMap();
Map weakHashMap = new WeakHashMap();
String keyHashMap = new String("keyHashMap");
String keyWeakHashMap = new String("keyWeakHashMap");
hashMap.put(keyHashMap, "helloHash");
weakHashMap.put(keyWeakHashMap, "helloWeakHash");
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:helloHash and weak hash map value:helloWeakHash
After: hash map value:helloHash and weak hash map value:null
答案 2 :(得分:6)
*是否会从WeakHashMap中删除该条目,即Map的大小是否为零? *
如果emp
包含构成员工strongly reachable的最后一个引用,那么地图中的条目可能将被删除。
Java文档总结得很好:
具有弱键的基于哈希表的Map实现。当其密钥不再正常使用时,WeakHashMap中的条目将自动被删除。更准确地说,给定密钥的映射的存在不会阻止密钥被垃圾收集器丢弃[...]。当一个键被丢弃时,它的条目将被有效地从地图中删除,因此该类的行为与其他Map实现略有不同。
在HashMap的情况下反之亦然?
从WeakHashMap中删除条目不会影响程序中的任何其他引用。
答案 3 :(得分:1)
java中的引用是内存地址,其中创建的对象指向内存。在WeakHashMap中,使用了弱引用的概念。
只要在java中创建一个对象并将其分配给某个变量,它就会变得非常强大。
弱引用对象有点类似于没有内存引用的对象,即它现在可以被垃圾收集。
答案 4 :(得分:1)
在其他Map实现(如HashMap)中,密钥可以很容易地访问。例如,如果HashMap将键作为Person类,如下所示,并且Person对象设置为null,即使在此之后如果我们将执行map.get(Person),我们将从内存中获取值,因为键被强烈引用在HashMap中。
wm.put(person, person.getFirstName());
person = null;
System.gc();
System.out.println("Hash Map :" + wm.toString());
输出:哈希地图:{test.Person@12dacd1=John}
与HashMap相比,WeakHashMap是一旦键在内存中没有引用就会删除它的那个。例如,如果WeakHashMap将键作为Person类,如下所示,并且如果Person对象设置为null,那么现在如果你执行map.get(Person),我们将从中获取null,因为键没有引用(或者相当弱)可达)。
wm.put(person, person.getFirstName());
person = null;
System.gc();
System.out.println("Weak Hash Map :" + wm.toString());
输出:弱哈希地图:{}
答案 5 :(得分:1)
WeakHashMap示例:
Map map = new WeakHashMap();
Foo foo = new Foo();
map.put(foo, "bar");
foo=null; // strong refrence is removed and object is available for garbage collection.
HashMap示例:
Map map = new HashMap();
Foo foo = new Foo();
map.put(foo, "bar");
foo=null; // even though the reference is nullified object will not garbage collected because map is having Strong refrence.