8

そのため、JavaWeakHashMapでは、キーが弱くなった場合にエントリが削除されるマップを作成できます。しかし、マップの値が弱くなったときにエントリが削除されるマップを作成するにはどうすればよいですか?マップを使用する理由は、IDに従ってオブジェクトを追跡するグローバルハッシュテーブルとして使用するためです。

ID --->  Object Address

Key ---> Value

(テキスト文字列はどこにありますかID

オブジェクトアドレスが弱くなったときに、それらを指す文字列ではなく、キーと値のペアを削除したいと思います。誰かこれについて何か考えはありますか?

4

4 に答える 4

10

このようなマップは、たとえばGuavaでサポートされています。

Map<..., ...> m = new MapMaker().weakValues().makeMap();
于 2011-04-14T16:39:39.043 に答える
3

エントリをガベージコレクションにするのはなぜですか?2つの理由があります

  1. メモリリークを回避します(weakReferenceがマップ内の何も指さないようにすることは避けてください)
  2. オブジェクトがガベージコレクションされた場合、myMap.get(myKey)はnullを返す必要があります。

解決策は通常のHashMapを使用します。

Map<String, WeakReference<Object>>

次に、2)が唯一の問題である場合は、myMap.get(myKey).get()を使用します。

エントリも削除する必要がある場合は、softHashMapについて説明しているこの投稿を参照し、weakReferencesを使用するように調整してください...

于 2011-04-14T17:12:45.713 に答える
2

APIには答えがあります:

実装上の注意: WeakHashMapの値オブジェクトは、通常の強力な参照によって保持されます。したがって、値オブジェクトが直接または間接的に自身のキーを強く参照しないように注意する必要があります。これにより、キーが破棄されるのを防ぐことができます。値オブジェクトは、WeakHashMap自体を介してそのキーを間接的に参照する場合があることに注意してください。つまり、値オブジェクトは、関連する値オブジェクトが最初の値オブジェクトのキーを強く参照する他のキーオブジェクトを強く参照する場合があります。これに対処する1つの方法は、次のように、挿入する前に値自体をWeakReferences内でラップし m.put(key, new WeakReference(value))、各getでアンラップすることです。

于 2011-04-14T16:41:40.800 に答える
2

WeakHashMapと同じように実行できますが、キーの代わりに値を使用します。値をWeakReferencesでラップし、マップに保持されているReferenceQueueに関連付けます。マップにアクセスするたびに、ReferenceQueueをチェックして、何かが追加されているかどうかを確認し、追加されている場合は、そのエントリをマップから削除します。キーを保持するWeakReferenceのサブクラスを作成する必要があるため、削除するエントリがわかります。また、マップをクエリするメソッド(getおよびcontainsKey、イテレーターメソッドなど)にチェックを追加して、取得したWeakReferenceに実際に値が含まれていることを確認する必要があります(null値を禁止するか、特別なセンチネルオブジェクトを使用してそれらを表す)。

于 2011-04-14T17:52:49.933 に答える