2

LWJGL を使用して、スペースバーを押すと小さな三角形を発射する三角形 (私の OpenGL の知識の程度) を制御できる単純な「ゲーム」を作成しました。各発射物は、作成時に ArrayList に格納されます: projectiles.add(new Projectile(x, y));. (以下に示すコード) をループすることでこれらにアクセスできますが、これは参照がまだ存在することを意味しますか?

for (int i = 0; i < projectiles.size(); i++) {
    projectiles.get(i).shoot();
}

ありがとう

4

4 に答える 4

5

はい、発射物への到達可能な参照が存在するため、発射物はガベージ コレクションの対象ではありません。

関連性がなくなった項目を ArrayList から削除する必要があります。そうしないと、ゆっくりとメモリが「リーク」します。

于 2012-06-04T01:12:02.290 に答える
5

答えは「おそらく」です。

ArrayList には、それが保持する要素への参照がありますが...

コードに ArrayList への参照がある場合、要素も (ArrayList 参照を介して) 参照されます。

ArrayList がコードで参照されていない場合、要素は参照され、ArrayList とそのすべての要素の両方がガベージ コレクションされる可能性があります。ArrayList とそのすべての要素の両方を逆参照するには、単純に実行します。list = null;

于 2012-06-04T01:19:39.783 に答える
2

これは、参照がまだ存在することを意味しますか?

はい、そうです。(Java におけるオブジェクトのリストは、オブジェクトへの参照のリストです。言語は、オブジェクトとその参照を実際には区別しません...それらは不可分です。)

リスト自体がどれくらい存在するかという二次的な問題がありますが、単純なルールは、アプリケーションがオブジェクトへの (ハード) 参照にアクセスする方法を持っている場合、オブジェクト (任意のオブジェクト!) は Java に存在し続けるということです。

あなたの例では、アプリケーションがまだそのループを実行できる場合、リスト内のオブジェクトが存在することが保証されます。限目。

リストへの参照を null に設定すると、ループが失敗することに注意してください。つまり、先ほど述べた前提条件が無効になります。その時点で、リストとその内容まだ存在している場合もあれば、存在しない場合もあります。しかし、これはループ コードを実行するという観点からは意味がありません。

(唯一の問題は、アプリケーションが使用しないオブジェクトへの参照を保持している場合、そのオブジェクトはとにかく存在し続ける可能性が高いということです。これはメモリ リークであり、問​​題になる可能性があります。起こりすぎる。)

于 2012-06-04T01:20:07.627 に答える
0

はい、通常、ArrayList は完全なオブジェクトではなく参照のみを保持します。arraylist から取得しようとするたびに、参照が提供されます。これが、arraylist から取得した値を格納するために使用されるオブジェクトをインスタンス化する必要がない理由です。

于 2012-06-04T02:28:45.457 に答える