9

一部のデータを有効期間中キーに関連付ける必要があるため、WeakHashMap. ただし、さらに、対応する値でキーを取得する必要があります。これを行う簡単な方法は、値を作成するときに参照を保持することです。

public class Key {}

public class Value { 
    final public Key key;
    public Value(Key k) {
        key = k;
    }
}

もちろん、Valueプログラムで使用している間keyは消えません。ただし、キーまたはその値への参照がマップ外になくなった場合、ガベージ コレクションは行われますか? それとも、値に残っている強力な参照がそれを妨げていますか?

4

2 に答える 2

14

いいえ、ガベージ コレクションは行われません。Javadocを参照してください。

実装上の注意: WeakHashMap の値オブジェクトは、通常の強い参照によって保持されます。したがって、値オブジェクトがそれ自体のキーを直接的または間接的に強く参照しないように注意する必要があります。これにより、キーが破棄されるのを防ぐことができます。

@biziclop で述べたように、1 つの解決策は、キーへの弱い参照を値オブジェクトに格納することです。

public class Value { 
  final public WeakReference<Key> key;
  public Value(Key k) {
    this.key = new WeakReference<Key>(k);
  }
}
于 2011-11-08T14:43:14.083 に答える
2

実装を見ると、答えはノーのようです。

これはWeakHashMapソースからのものです:

/**
 * The table, resized as necessary. Length MUST Always be a power of two.
 */
private Entry[] table;

...

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

ご覧のとおり、Entryオブジェクトはマップ自体によって強く参照されています。したがって、マップにアクセスできる場合は、Entry、したがってValueオブジェクト、およびキーもアクセス可能になります。

于 2011-11-08T14:43:30.917 に答える