5

に相当するものを探しています

WeakHashMap<K, V>

クラスと同じですが、複数のキーを 1 つの値にマップする点が異なります。

WeakHashMap<K1, K2, V>
WeakHashMap<K1, K2, K3, V>
etc.

あなたgetsetエントリがデータベースの複数列の主キーのようになる方法: 複数のキーを使用し(K1, K2)項目を配置します。&セマンティクス、GC セマンティクスは次のようになります: 到達できなくなったエントリは GC されます。これは、そのキーのいずれにも到達できなくなったことを意味します。getset

他の誰かが以前にこのようなものを必要としていましたか? そのような要件にどのようにアプローチしますか? 弱くない HashMap でできるように、Tuple をキーとして格納することはできません (Tuple はほとんどすぐに GC され、誰もそれを指しません)。

このようなものが以前に作成されていた場合は、喜んで使用しますが、WeakReferences と通常のハッシュマップからそのようなものを構築する方法を考えようとして、空白を考え出しています。

4

1 に答える 1

1

興味深い問題です。これの実装については知りませんが、ソースを に適応させることでアプローチしWeakHashMapます。これは aを使用し、ReferenceQueueほぼすべての public メソッドの開始時にそれをポーリングし、GC されたすべての参照先のエントリを削除します。

WeakHashMapマルチキーの弱いマップに適応する方法の大まかな概要は次のとおりです。

  1. 説明したように複合キーを定義し、それをメイン エントリ セットに使用します
  2. キー コンポーネントから、それが参加するキーのセットへの内部マップを維持する
  3. で参照対象コンポーネントを見つけたら、ReferenceQueueそれが参加しているキーのセットを検索し、それらのキーをメイン エントリ セットから削除します。
  4. また、参加している各キーを他のすべてのキー コンポーネントのセットから削除する必要があります。つまり、参照キューにキー コンポーネント c 1があり、キー k 1、...、k nに参加しているとします。次に、各 k iについて、他のキー コンポーネントが c 2と c 3の場合、c 2とc 3のキー セットからk iを削除し、c 1のエントリ全体を削除する必要があります。
  5. コンポーネントのキー セットが空の場合、そのコンポーネントのキー セット マップ エントリも削除する必要があります。つまり、コンポーネントからキーセットへのマップに対応するデータがない参照キューにコンポーネントが見つかる可能性があります。

ここで問題なのは、これらすべての内部マップを、主要なコンポーネントの GC を妨げないように設定する必要があるということです。つまり、この multi-key-map 構造内にハード (またはソフト) 参照があってはなりません。WeakHashMapは、( を実装する)内部EntryクラスをMap.Entryextends することによってこれを実現しWeakReferenceます。キーが gcEntryされると、参照キューに置かれるのはキー自体ではなくオブジェクトです。このようなものは、すべての内部構造 (複合キー オブジェクト、エントリ セット、キー コンポーネントからキー セットへのマップ、およびキー セット自体) の設計で使用する必要があります。

于 2012-12-13T04:56:16.233 に答える