1

これは奇妙な質問です。しかし、ここに行きます。

オブジェクト X があり、配列、ハッシュテーブル、別のオブジェクト (コンテナー オブジェクト) 内に挿入されます。これは、3D 空間の点 P にある X のインスタンスを表します。

ときどき、特定の P で X を更新したくなることがあります。これは簡単です。テーブルから点 P を呼び出して、配列を直接操作します。

ここで、これらの X が Y の一部であるとしましょう。正確には、Y のフラグメントです。与えられた Y が消えるとしましょう。Y が消えれば、それに付いているすべての X も消えるはずですよね?

正確には、オブジェクト Y はモデルから概念的に削除されています。実際に削除されるかどうかは重要ではありません (たとえば、別の場所に保存される可能性があります)。ただし、顕著な点は、Y の近くにあるすべてのポイントの X をチェックする以外に、それらをハッシュテーブルから適切に削除するにはどうすればよいかということです。

  1. それらは配列の一部であるため、別の Y の X もそこにある可能性が高いため、指定された Y に属する X だけを削除する必要があります。
  2. Y に属する X のハッシュテーブル構造を検索できます。たとえば、Y が占有するすべてのポイント P を把握し、それらのコンテナーを引き出して、Y に接続されているすべての X を削除できます。
  3. それらを直接削除できますか? Y に X のリストがある場合、テーブルを検索する手間をかけずに、参照によってそれらを削除できますか?

これは、実際には参照全体に関する一般的な質問です。オブジェクトへの複数の参照が存在する状況が他にもあり、他の場所に移動することなく、そのオブジェクトをすばやく削除できるようにしたいと考えています。

これは、1 つの参照クラスがオブジェクトを削除する場合、そのオブジェクトは普遍的に「削除」する必要があることを意味します。他のリストのどれもそれへの参照を保持すべきではありません。

4

1 に答える 1

1

Java では、この問題はオブジェクトで対処されることがよくありますWeakReference<T>。オブジェクトXが収集されるのを防ぐために参照が必要ない場合は、それを にします。他の場所から強く参照されなくなっWeakReference<X>た場合、Java はそれを無効にします。X

たとえば、List<X>生きているすべてのオブジェクトを保持する を作成し、他のすべての参照をXweak にすることができます。オブジェクトがリストから削除され、最後の強い参照がなくなると、そのオブジェクトへの弱い参照の数に関係なく収集可能になります。明らかな欠点は、各弱参照を逆参照する前に null に注意を払う必要があることです。この時点で、Java がすべての参照追跡を行います。null になった弱い参照を一掃するだけで済みます。これは、多数のリストを検索するよりもはるかに簡単です。

于 2012-05-25T16:17:20.967 に答える