【问题标题】:Java SoftHashMap ImplementationJava SoftHashMap 实现
【发布时间】:2026-01-06 22:45:01
【问题描述】:

我想基于 Java SoftReferenceHashMap 实现 SoftHashMap。 Java 文档,关于 WeakHashMap,说键是弱引用而不是值。我想知道hashcode() 将用于底层HashMap 的放置和拉取功能。我假设WeakHashMap put 像这样工作:hashMap.put(new WeakReference(key), value); 如果这是真的,如何找到密钥的条目。

如果值被包裹在WeakReference 中而不是键中不是更好吗?

【问题讨论】:

  • 标准API类的源码是JDK自带的,看看就好。
  • 这里是WeakHashMap.put()的参考impl的链接,它不符合你描述的模式。
  • 其他库包括弱值映射和其他用于其他目的的变体。
  • 读者可能想看看现有的 SoftHashMap 实现:*.com/questions/264582/…

标签: java weakhashmap


【解决方案1】:

如果您查看此IBM article,您会看到他们给出的可能实现:

public class WeakHashMap<K,V> implements Map<K,V> {

private static class Entry<K,V> extends WeakReference<K> 
  implements Map.Entry<K,V> {
    private V value;
    private final int hash;
    private Entry<K,V> next;
    ...
}

public V get(Object key) {
    int hash = getHash(key);
    Entry<K,V> e = getChain(hash);
    while (e != null) {
        K eKey= e.get();
        if (e.hash == hash && (key == eKey || key.equals(eKey)))
            return e.value;
        e = e.next;
    }
    return null;
}

put 通常会添加一个 Entry - 但该 Entry 是一个引用 Key 对象的 WeakReference。如果 Key 被垃圾回收,Entry 最终会被 WeakHashMap 的 expungeStaleEntries() 方法清除,该方法会经常从其他 WeakHashMap 操作中调用。

【讨论】: