2

ハッシュテーブルに関して少し質問があります。ハッシュテーブルに格納されているキーとして文字列があり、値として複雑なオブジェクトがあるとします。

ここで、「get」を使用して、同じハッシュテーブルからオブジェクトを取得します。ここで、ハッシュテーブルから取得したオブジェクトの参照を格納した変数がnullに設定されている場合、これはハッシュテーブル内のオブジェクトのメモリに影響を与えません。ハッシュテーブル内のオブジェクトを破棄するにはどうすればよいですか?

1つの方法は、指定されたキーの値としてnullを設定することです。他にもっとエレガントな方法はありますか?

4

2 に答える 2

2

クラスインスタンス(=オブジェクト)はメモリに残り、インスタンスへの参照は変数とHashMap値に格納されます。インスタンスへの参照が残っていない場合、ある時点でJavaVMガベージコレクターがメモリを解放する可能性があります。

参照は、その変数が新しい値(別のインスタンスまたはnull)を取得するか、スコープ外になると消えます。したがって、マップ値のインスタンスを削除する場合は、マップからそのキーを削除するか、キーを保持して値をnullに設定することができます。通常は削除します。マップにnullを保持することは、必要がない限り、通常は実行したいことではありません。他の参照が残っていない場合、インスタンスはガベージコレクションの対象になります。

C ++との違いに関する注意:Javaには、クリーンアップ用のデストラクタはありません(finalizeメソッドが呼び出される保証はありません)。Javaクラスに、完了時に閉じる必要のあるファイルやネットワーク接続などのリソースがある場合、クラスにはcloseメソッドが必要であり、プログラマーはそれを明示的に呼び出す責任があります(多くの場合、試行中...キャッチがない場合でもfinallyブロックします) )、彼がオブジェクトを使い終わったとき。

于 2012-11-01T06:12:30.900 に答える
1

まず、Mapの代わりに使用しHashtableます。次に、このMap#removeメソッドを使用して、キーの参照をメモリから解放できます。キーと値のペアをから削除しますがMap、GCがオブジェクトを収集することを決定するまで、オブジェクトは存続することに注意してください。

Mapvsについての説明Hashtable

HashMapとは両方ともインターフェースHashtableの実装であることに注意してください。Map

于 2012-11-01T06:03:06.863 に答える