0

Javaと. SoftHashMap_ WeakHashMap に関する Java ドキュメントでは、キーは値ではなく弱参照であると書かれています。基礎となる の put および pull 機能に何が使用されるのか疑問に思っていました。put は次のように機能すると想定しています。これが正しい場合、キーのエントリはどのように検出されるでしょうか。SoftReferenceHashMaphashcode()HashMapWeakHashMaphashMap.put(new WeakReference(key), value);

値がWeakReferenceキーではなく a でラップされた方がよいのではないでしょうか?

4

1 に答える 1

3

この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 です。キーがガベージ コレクションされている場合、エントリは、他の WeakHashMap 操作から頻繁に呼び出される WeakHashMap の expungeStaleEntries() メソッドによって最終的に消去されます。

于 2011-07-30T21:16:38.193 に答える