面试题:简述 WeakHashMap 的工作原理 ?

WeakHashMap 是 Java 集合框架中的一种特殊 Map 实现,它的键(key)是弱引用(Weak Reference)。WeakHashMap 的主要特点是:当键不再被外部强引用时,键值对会被自动回收。以下是 WeakHashMap 的工作原理:


1. 弱引用(Weak Reference):

  • 弱引用是一种特殊的引用类型,由 java.lang.ref.WeakReference 类表示。
  • 如果一个对象只被弱引用指向,而没有强引用指向它,那么在下一次垃圾回收(GC)时,该对象会被回收。
  • WeakHashMap 的键是弱引用,因此当键不再被外部强引用时,键对象会被垃圾回收。

2. 内部实现:

  • WeakHashMap 的内部实现基于哈希表,类似于 HashMap
  • 每个键值对的键被包装在一个 WeakReference 中。
  • 当垃圾回收器回收了某个键对象时,WeakHashMap 会自动移除对应的键值对。

3. 工作原理:

  1. 插入键值对:
    • 当向 WeakHashMap 插入键值对时,键会被包装成一个 WeakReference
    • 如果键对象没有被外部强引用,它可能会在下一次垃圾回收时被回收。
  2. 垃圾回收:
    • 当垃圾回收器运行时,会检查所有弱引用对象。
    • 如果某个键对象只被 WeakHashMap 的弱引用指向,而没有其他强引用指向它,垃圾回收器会回收该键对象。
    • 回收后,WeakHashMap 会自动移除对应的键值对。
  3. 访问和清理:
    • 当访问 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
点赞10 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容