📅  最后修改于: 2023-12-03 15:15:58.193000             🧑  作者: Mango
java.util.WeakHashMap
是 Java 标准库中的一种 Map
类型,与 HashMap
类似,但是它会自动删除无用的键值对,以免造成内存泄漏。它的特点是使用弱引用来保存键,当该键不再被其它对象引用时,就会被自动删除。因为弱引用只会在垃圾回收阶段被回收,所以 WeakHashMap
中的元素并没有被显式地移除,而是通过垃圾回收机制在适当时候清除掉的。
在 Java 中,当一个对象的所有引用都被释放了,垃圾回收器会将该对象回收,释放内存。弱引用(Weak Reference)就是对被引用的对象并不持有强引用,而只是一个弱引用。弱引用的特点是如果这个对象没有被别的强引用或弱引用所持有,那么这个对象就会被垃圾回收器回收。
String s = new String("hello");
WeakReference<String> strRef = new WeakReference<>(s);
s = null;
System.gc(); // 弱引用对象在主动调用System.gc()之后可能被回收
String str = strRef.get(); // 获取弱引用所引用的对象,可能为空
在上面的代码中,我们创建了一个 String
对象 s
,并且将其创建的弱引用 strRef
指向了它。然后,我们将 s
的值赋为 null
,这样就没有强引用对象指向 s
了。最后我们调用 System.gc()
主动要求垃圾回收器进行回收,然后尝试访问 strRef
所引用的对象,如果垃圾回收器回收了 s
,那么 strRef.get()
返回的就是 null
。
以下是一个 WeakHashMap
的示例。
WeakHashMap<String, Integer> map = new WeakHashMap<>();
map.put(new String("key"), 1);
在上面的代码中,我们创建了一个 WeakHashMap
对象,然后向其中添加了一个键值对。需要注意的是,我们创建了一个新的 String
对象并将其作为键,而非使用字面量如 "key"
。这是因为,如果我们使用字面量,这个字符串将被缓存在字符串池中,并且会被其它对象所持有强引用,从而不会被回收。而使用 new String()
创建一个新的对象,它没有被缓存在字符串池中,一旦没有其它对象持有这个对象,它就会被垃圾回收器回收,从而 WeakHashMap
中对应的键值对也会被删除。
WeakHashMap
使用弱引用来保存键值对,当键不再被其它对象引用时会自动删除。但与此同时, WeakHashMap
的性能也会收到一定的影响。在添加、删除元素的操作中,它的速度通常会比 HashMap
慢一些,因为要额外维护弱引用的关系。因此,在选择集合类型时,我们需要根据实际的需求和场景进行权衡。