2011-06-22 6 views
3

今日、私はthis blog postを見つけ、キャッシュの上でWeakHashMapの使用法を論じました。値はなく、キーは弱い参照として格納され、参照がもう生存していないときは、キーと値のペア全体が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クラスを利用するだろうかシナリオ好奇心?

+0

オートボクシングを使用すると、明示的に呼び出す必要はありません。 '新しいロング(10)'これで十分です: 'map.get(10L);' –

+0

[WeakHashMapまたはWeakReferenceをいつ使うのですか?](http://stackoverflow.com/questions/154724/when-would-you-use- a-weakhashmap-or-a-weakreference) –

+1

@Matt Ball、WeakHashMapのユースケースを他のコンストラクトと比較するのではなく、いくつかのユースケースを取得することになるので、これは重複しません。 –

答えて

3

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

+0

そして、そのオブジェクトは弱いハッシュマップのキーです。 –

+0

警告の+1。値 - >キーサイクルがある場合は、[エフェメロンペア](http://en.wikipedia.org/wiki/Ephemeron)が必要です。 –

+0

情報をありがとう、今私はWeakHashMapの目的を参照してください。実際には、キーオブジェクトは利用できないため、メタデータを格納するための巧妙な解決策です。メタデータに関連付けられたすべてのメタデータを自動的に破棄する必要があります。 @Mikeは同意した。 –

1

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

Guavaには、非強力な参照マッピング構造の完全なセットがあります。

+0

はい、良い点。たぶん私はリフレクションでリトリーブすることを避けるために、リフレクトで取り出すタイプのメタデータをキャッシュするためにこれを自分で使うことができます。 –

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 
関連する問題