1

オブジェクトを作成し、そのオブジェクトを List または Map に配置した場合、そのオブジェクトを null に設定すると、List および Map のコンテンツに影響しますか?

お気に入り:

Object obj = new Object();
List<Object> list = new ArrayList<Object>();
Map<Integer, Object> map = new HashMap<Integer, Object>();

list.add(obj);
map.put(1, obj);

obj = null;

この行の後、リストとマップの両方のコンテンツをnullにしたい場合、それは可能ですか? そうでない場合、それは達成可能ですか?どのように?

4

4 に答える 4

3

オブジェクトを作成し、そのオブジェクトを List または Map に配置した場合、そのオブジェクトを null に設定すると、List および Map のコンテンツに影響しますか?

いいえ、それは起こりません。オブジェクトをListorMapに配置するのではなく、そのオブジェクトへの参照を配置します。したがって、元の参照ポイントをにすると、またはnull内の参照は引き続き同じインスタンスを指します。ListMap

リストとマップの両方のコンテンツをnullにしたい場合、それは可能ですか?

はい、可能ですが、手動で行う必要があります。繰り返し処理を行い、List各要素を に設定しますnull。内でも同じことMapですが、各値をnull手動で設定する必要があります。

于 2012-11-29T05:49:34.777 に答える
0
Object obj = new Object();

Object objの参照を保持するオブジェクト型の参照はこちらを参照してくださいnew Object();

その場合list.add(obj);、リスト0thインデックスはobjマップに対して同じ参照と同じ参照を保持します。

obj = null;これを行うと、参照は以前ではなくobjnull を保持するようになり、オブジェクトには影響しませんObject

まだ参照を保持しているnew Object();ため、まだ到達できないことを確認してください。list and map写真にない場合は、オブジェクトに到達できないため、Garbage collectorは を収集します。object

WeakHashMap<K,V>はマップの例です。WeakHashMap のエントリは、そのキーが通常使用されなくなったときに自動的に削除されます。より正確には、特定のキーのマッピングが存在しても、キーがガベージ コレクターによって破棄されること、つまり、ファイナライズ可能になり、ファイナライズされてから再利用されることを防ぐことはできません。キーが破棄されると、そのエントリは事実上マップから削除されるため、このクラスは他の Map 実装とは多少異なる動作をします。

于 2012-11-29T05:50:34.517 に答える
0

オブジェクトを作成し、そのオブジェクトを 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 です) は、次のガベージ コレクション サイクルで破棄されます [...]

于 2012-11-29T06:03:03.060 に答える
0

この行の後、リストとマップの両方のコンテンツをnullにしたい場合、それは可能ですか? そうでない場合、それは達成可能ですか?どのように?

objまず、 yourを null に設定しないでください。リストとマップをループし、要素を obj と比較し、一致する場合は null に設定します。後でobj同様に null に設定します。

for(int i=0; i<list.size(); i++) {
  if(list.get(i) == obj) {
    list.set(i, null);
    break;
  }
}

for(Integer key: map.keySet()) {
  if(map.get(key) == obj) {
    map.put(key, null);
  }
  break;
}

obj = null;
于 2012-11-29T06:11:00.523 に答える