3

今日、私はオーバーキャッシュ の使用法について議論したこのブログ投稿を見つけました。WeakHashMap値ではなくキーが弱参照として格納され、参照が存在しなくなると、キーと値のペア全体がWeakHashMapから削除されるという事実に興味をそそられました。したがって、これにより次のことが発生します。

WeakHashMap map = new WeakHashMap();
SomeClass myReference1 = .... 
map.put(new Long(10), myReference1);
// do some stuff, but keep the myReference1 variable around!
SomeClass myReference2 = map.get(new Long(10)); // query the cache
if (myReference2 == null) {
    // this is likely to happen because the reference to the first new Long(10) object
    // might have been garbage-collected at this point
}

WeakHashMapその場合、どのシナリオがクラスを利用するのか興味がありますか?

4

3 に答える 3

3

ライフサイクルを制御していないオブジェクトにメタデータを添付する場合。一般的な例はClassLoaderですが、値->キー参照サイクルを作成しないように注意する必要があります。

于 2011-06-22T15:58:38.133 に答える
1

多くの用途がありますが、本当に重要なのは、で何かをキーイングしたい場合ですClass。インスタンスへの強力な参照を維持すると、Classクラスローダー全体をペグできます。

余談ですが、Guavaには、強力ではない参照マッピング構造のはるかに完全なセットがあります。

于 2011-06-22T15:58:39.477 に答える
1

サンプルコードを実行して、HashMapとWeakHashMapの違いを理解しました。お役に立てば幸いです。

        Map hashMap= new HashMap();
        Map weakHashMap = new WeakHashMap();

        String keyHashMap = new String("keyHashMap");
        String keyWeakHashMap = new String("keyWeakHashMap");

        hashMap.put(keyHashMap, "helloHash");
        weakHashMap.put(keyWeakHashMap, "helloWeakHash");
        System.out.println("Before: hash map value:"+hashMap.get("keyHashMap")+" and weak hash map value:"+weakHashMap.get("keyWeakHashMap"));

        keyHashMap = null;
        keyWeakHashMap = null;

        System.gc();  

        System.out.println("After: hash map value:"+hashMap.get("keyHashMap")+" and weak hash map value:"+weakHashMap.get("keyWeakHashMap"));

出力は次のようになります。

Before: hash map value:helloHash and weak hash map value:helloWeakHash
After: hash map value:helloHash and weak hash map value:null
于 2013-06-29T13:09:09.880 に答える