1
ReferenceQueue<Integer> queueObj = new ReferenceQueue<Integer>();
WeakReference<Integer> referenceObj = new WeakReference<Integer>(new Integer(1), queueObj);

以上のように理解していますが、

  • まず、新しい Integer(1)オブジェクトのWeakReference referenceObjオブジェクトを作成します。
  • 次に、システムがreferenceObjオブジェクトをqueueObj オブジェクトに移動します。現在、queueObjにはreferenceObj要素があります。
  • 3 番目に、システム GC で新しい Integer(1)オブジェクトを取得し、 queueObjオブジェクトをクリアします。現在、queueObjは空です。

正しく?

編集:

  • まず、新しい Integer(1)オブジェクトのWeakReference referenceObjオブジェクトを作成します。
  • 次に、システムがreferenceObjオブジェクトをqueueObj オブジェクトに移動します。現在、 queueObjにはreferenceObj要素があり、新しい Integer(1)オブジェクトがシステムによって収集されています。
  • 第三に、一部のプログラムはqueueObj が空かどうかを検出します。そうでない場合は、いくつかの指示対象が収集されたことがわかるので、queueObjを反復処理してreferenceObjを処理できます。
4

1 に答える 1

1

1番目と2番目、正しい。第三に、間違っています。ReferenceQueue の処理、エントリの削除、エントリがアプリケーションにとって何を意味するかなどは、ユーザー次第です。たとえば、WeakHashMap はバックグラウンドで ReferenceQueue を処理して、いつマップからアイテムを削除するかを認識します。

于 2012-10-11T09:37:22.967 に答える