WeakHashMap
是 Java 集合框架中的一种特殊 Map
实现,它的键(key)是弱引用(Weak Reference)。WeakHashMap
的主要特点是:当键不再被外部强引用时,键值对会被自动回收。以下是 WeakHashMap
的工作原理:
1. 弱引用(Weak Reference):
- 弱引用是一种特殊的引用类型,由
java.lang.ref.WeakReference
类表示。 - 如果一个对象只被弱引用指向,而没有强引用指向它,那么在下一次垃圾回收(GC)时,该对象会被回收。
WeakHashMap
的键是弱引用,因此当键不再被外部强引用时,键对象会被垃圾回收。
2. 内部实现:
WeakHashMap
的内部实现基于哈希表,类似于HashMap
。- 每个键值对的键被包装在一个
WeakReference
中。 - 当垃圾回收器回收了某个键对象时,
WeakHashMap
会自动移除对应的键值对。
3. 工作原理:
- 插入键值对:
- 当向
WeakHashMap
插入键值对时,键会被包装成一个WeakReference
。 - 如果键对象没有被外部强引用,它可能会在下一次垃圾回收时被回收。
- 当向
- 垃圾回收:
- 当垃圾回收器运行时,会检查所有弱引用对象。
- 如果某个键对象只被
WeakHashMap
的弱引用指向,而没有其他强引用指向它,垃圾回收器会回收该键对象。 - 回收后,
WeakHashMap
会自动移除对应的键值对。
- 访问和清理:
- 当访问
WeakHashMap
时(如调用get
或put
方法),WeakHashMap
会检查是否有键对象被回收。 - 如果有,
WeakHashMap
会清理这些无效的键值对。
- 当访问
4. 适用场景:
- 缓存:
WeakHashMap
适合用作缓存,当缓存项的键不再被外部引用时,缓存项会自动被清理,避免内存泄漏。
- 监听器管理:
- 在事件监听器或回调管理中,可以使用
WeakHashMap
来避免因未及时移除监听器而导致的内存泄漏。
- 在事件监听器或回调管理中,可以使用
5. 代码示例:
import java.util.WeakHashMap;
public class WeakHashMapExample {
public static void main(String[] args) {
WeakHashMap<Key, String> map = new WeakHashMap<>();
Key key1 = new Key("key1");
Key key2 = new Key("key2");
map.put(key1, "Value1");
map.put(key2, "Value2");
System.out.println("Before GC: " + map); // 输出: {key1=Value1, key2=Value2}
// 移除 key1 的强引用
key1 = null;
// 触发垃圾回收
System.gc();
// 等待垃圾回收完成
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("After GC: " + map); // 输出: {key2=Value2}
}
}
class Key {
private String id;
public Key(String id) {
this.id = id;
}
@Override
public String toString() {
return id;
}
@Override
public int hashCode() {
return id.hashCode();
}
@Override
public boolean equals(Object obj) {
return obj instanceof Key && ((Key) obj).id.equals(this.id);
}
}
6. 总结:
WeakHashMap
的键是弱引用,当键不再被外部强引用时,键对象会被垃圾回收。- 自动清理:当键对象被回收后,
WeakHashMap
会自动移除对应的键值对。 - 适用场景:适合用作缓存或监听器管理,避免内存泄漏。
通过理解 WeakHashMap
的工作原理,可以更好地利用它来管理内存敏感的数据结构。
THE END
暂无评论内容