📜  Java WeakHashMap(1)

📅  最后修改于: 2023-12-03 15:15:58.193000             🧑  作者: Mango

Java WeakHashMap

java.util.WeakHashMap 是 Java 标准库中的一种 Map 类型,与 HashMap 类似,但是它会自动删除无用的键值对,以免造成内存泄漏。它的特点是使用弱引用来保存键,当该键不再被其它对象引用时,就会被自动删除。因为弱引用只会在垃圾回收阶段被回收,所以 WeakHashMap 中的元素并没有被显式地移除,而是通过垃圾回收机制在适当时候清除掉的。

弱引用(Weak Reference)

在 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 的示例。

WeakHashMap<String, Integer> map = new WeakHashMap<>();
map.put(new String("key"), 1);

在上面的代码中,我们创建了一个 WeakHashMap 对象,然后向其中添加了一个键值对。需要注意的是,我们创建了一个新的 String 对象并将其作为键,而非使用字面量如 "key"。这是因为,如果我们使用字面量,这个字符串将被缓存在字符串池中,并且会被其它对象所持有强引用,从而不会被回收。而使用 new String() 创建一个新的对象,它没有被缓存在字符串池中,一旦没有其它对象持有这个对象,它就会被垃圾回收器回收,从而 WeakHashMap 中对应的键值对也会被删除。

总结

WeakHashMap 使用弱引用来保存键值对,当键不再被其它对象引用时会自动删除。但与此同时, WeakHashMap 的性能也会收到一定的影响。在添加、删除元素的操作中,它的速度通常会比 HashMap 慢一些,因为要额外维护弱引用的关系。因此,在选择集合类型时,我们需要根据实际的需求和场景进行权衡。