2

「敵」と呼ばれる「死んだ」オブジェクトを削除しているとしましょう。

次のようなものを使用します。

for(int i = 0; i < enemies.size(); i++)
    {
    Enemy en = (Enemy) enemies.get(i);
    if(en.getVisible() == true)
        en.update();
    else
        enemies.remove(i);
    }

ArrayList から削除された後、オブジェクトは削除されますか? それとも「すべき」ですか?以前は主に C++ コードを扱っていましたが、ガベージ コレクションに戸惑っています。

オブジェクトがガベージ コレクターによって削除されているかどうかを確認する方法はありますか?

ありがとう

4

5 に答える 5

1

ArrayList からオブジェクトを削除し、そのオブジェクトに他の参照がない場合、そのオブジェクトはガベージ コレクターに「適格」になります。その後、ヒープから削除することを心配する必要はありません。JVM は自動ガベージ コレクターを介してそれを行います。

于 2013-03-27T05:43:01.363 に答える
1

私は、C/C++ と Java を使用したガベージ コレクションの大失敗とは正反対の状況を見るのが本当に好きです。Java には独自のガベージ コレクタがあり、メモリ管理について心配する必要はありません。.remove() で十分です。

于 2013-03-27T05:40:43.080 に答える
0

オブジェクトにどのように入力したかによると思います。他の場所に保存した場合はまだ存在するはずですが、arrayList に直接追加した場合はおそらくゴミです。

PSあなたのコードは修正が必要です

enemies.remove(i);
enemies.remove(i--);
于 2013-03-27T05:43:04.307 に答える
0

バックについての私のコメントを取りConcurrentModificationExceptionます。取得できませんが、ループはまだ正しくありません。見てみましょう:

List<String> list = new ArrayList<String>(Arrays.asList("A","B","C","D"));
for (int i = 0; i < list.size(); i++) {
    String s = list.get(i);
    if ("B".equals(s) || "C".equals(s)) list.remove(i);
}
System.out.println(list);

出力:

[A, C, D]

Ci要素が常に増加およびスキップされるため、削除されません。

于 2013-03-27T05:53:37.843 に答える
0

ほとんどの場合、Java での明示的なメモリ管理について心配する必要はありません。リストから削除された後にそれらを参照している他のオブジェクトがない限り、ガベージ コレクターは (最終的に) それらを削除します。

リスト内のオブジェクトが、enemies明示的に破棄する必要のあるシステム リソースまたはその他のもの (ファイル ハンドルなど) を保持している場合は、参照を失う前にこれをクリーンアップする必要があります。

Enemy enemy = enemies.remove();
enemy.dispose(); // this is your method to clean up the internals - name it what you want
// continue your loop here

サンプル コードに関連するメモとして、現在のインデックスとリスト サイズに関する問題に遭遇することなく適切に実行Iteratorできるように、インデックスを反復処理する for ループだけでなく、を使用することをお勧めします。remove別の実装を検討することもできListます (たとえばLinkedList、 の途中からの挿入/削除は、サイズがArrayList大きい場合に高価になる可能性があるためです。

あなたの他の質問について:

オブジェクトがガベージ コレクターによって削除されているかどうかを確認する方法はありますか?

クラスのメソッドをオーバーライドfinalizeできますが、これを行うときは注意してください。また、オブジェクトがガベージ コレクションされる時期が保証されないことにも注意してください。JVM が異なれば、メモリの管理方法が若干異なることが多く、より多くのメモリが必要な場合にのみガベージ コレクションを実行することがよくあります。

于 2013-03-27T05:58:28.143 に答える