2

ArrayListを使用して、リスト内の位置によってキー設定されたアイテムのリストを保持している場合があります。他のオブジェクトは、その位置によってArrayListアイテムを参照します。リストからアイテムの1つを削除した場合、リスト内のアイテムへの他のすべての参照が無効になるため、リストを縮小したくありません(たとえば、アイテム2が位置1になります)。配列リストの縮小の問題に対する私の解決策は、リストが縮小しないように、配列リスト内の位置をnullにすることです。これにより、その位置にあるアイテムが以前保持していた記憶が解放されるかどうかが気になります。

この要件を達成するためのより良い方法があれば、私はそれについて知りたいです。

4

3 に答える 3

7

与えられたキー (インデックス) によってアイテムを長期間にわたって一貫して参照するという目標を考えると、実際にはディクショナリまたはハッシュテーブルが必要であり、ArrayList は目的に対して間違ったデータ構造であり、この方法で 1 つを使用することは非常に危険です。 . 誰かがどこかで 1 つの要素を削除するだけで、すべての参照が間違っています。誤ったデータを取得するエラーよりも悪いことです。

これには適切なデータ構造を使用し、要素を特定のキー (Dictionary または Hashtable) に関連付けるために作成されたデータ構造を使用します。

于 2012-11-27T03:19:42.923 に答える
2

簡単な答えは「はい」です。オブジェクトへの他の参照がない場合、メモリは解放されます。gcを実行することはできますが、解放する方法とタイミングを実際に制御することはできません。これは適切な方法ではなく、クリーンアップされることを保証するものではありません。

ArrayListは同期されないことに注意してください。ArrayListを参照する複数のオブジェクトがあると述べています。同時変更を避けるために同期する必要があります。

ArrayListに縛られていますか?順序はあなたにとって重要ですか、それともリスト内のアイテムへの一貫した参照があるというだけですか?

于 2012-11-27T03:04:24.013 に答える
0

ArrayListin Java が .NET のように機能する場合、ArrayListそれは単なる配列のラッパーです。内部配列が小さすぎる場合、新しい大きな配列が割り当てられ、すべての項目が新しい配列にコピーされます。この手順は、内部配列が小さくなりすぎるたびに繰り返されます。

結論:

  1. 含まれているオブジェクトは、array[mypos] = null.
  2. 新しいアイテムを追加し続けると、内部配列は拡大し続けます。
于 2012-11-27T07:28:57.680 に答える