オブジェクトを作成し、そのオブジェクトを List または Map に配置した場合、そのオブジェクトを null に設定すると、List および Map のコンテンツに影響しますか?
いいえ。List
と はMap
まだそのオブジェクトへの強い参照を持っているためです。そのため、ガベージ コレクターはメモリからオブジェクトを回収できません。
この行の後、リストとマップの両方のコンテンツをnullにしたい場合、それは可能ですか? そうでない場合、それは達成可能ですか?どのように?
List と Map については、WeakReferencesを使用して次のようなことを行うことができます。
Object obj = new Object;
WeakReference<Object> weakReference = new WeakReference<>(obj);
List<WeakReference> list = new ArrayList<>();
list.add(weakReference);
Map<Integer, WeakReference> map = new HashMap<>();
map.put(1, obj);
//Now set the only strong reference to null
obj = null;
したがって、ガベージコレクションが発生した場合、次のようなことをしようとすると:
map.get(1).get(); //May return null if GC ocurred
list.get(0).get(); // Same here
ただし、マップのエントリと要素をリストから削除する必要があります。
このクリーンアップでは、ReferenceQueueMap
を使用してandで反復する必要がありますList
。
この記事から引用します:
弱くしか到達できないオブジェクト (それへの最も強力な参照は WeakReferences です) は、次のガベージ コレクション サイクルで破棄されます [...]