Java は foreach ループに入るたびに新しいオブジェクトを作成しますか? 各繰り返しについて話しているわけではありませんが、複数回使用される foreach ループがある場合、毎回オブジェクトを作成していますか?
簡単な例:
for(Object o : Objects)
{
for(Object p : Objects2)
{
}
}
p
実行ごとに 1 つしかありませんか、それともp
それぞれに対してインスタンス化されますObject o
か? ガベージ コレクターは、終了するたびに foreach ループからオブジェクトを回復する必要がありますか?
具体的には、Android ベースのゲーム コードを書いています。すべてのゲーム オブジェクトを毎秒指定された速度で、または状況に応じてできるだけ速く反復処理します。
時期尚早の最適化のケースかもしれませんが、明示的なfor
orwhile
ループを使用することで、ループから余分なガベージ コレクションが発生しないことが保証される場合は、それをプロジェクトのコーディング標準として確立できます。
すなわち:
public void update()
{
for(GameObject gObj : gameObjects)
{
gObj.update();
}
}
前述update()
のタイミングに基づいて呼び出しを行うように設計されたスレッドから呼び出されます。
更新:p
のそれぞれに対して新しい参照が作成されているo
か
どうかを尋ねていObjects
ます。のオブジェクトをコピーする場合ではありませんObjects2
。では、VM は新しい Reference を作成する必要がp
あり、外側のループの反復間でその参照を収集しますか? より具体的には、私の場合、メソッド呼び出し間の参照を収集しますか?
更新: Matt Ball の回答に関するコメントから。ガベージ コレクションの作業が少なくて済むのはどれですか?
//Loop just to have it run a number of times
//Could be running the inner foreach numerous time for any reason
for(int i = 0; i < 1000; i++)
{
for(Object o : Objects)
{
o.update();
}
}
対。
Iterator<Object> iter;
//Loop just to have it run a number of times
//Could be running the inner foreach numerous time for any reason
for(int i = 0; i < 1000; i++)
{
iter = Objects.iterator();
while(iter.hasNext());
{
iter.getNext().update();
}
}
更新: スコープの比較:
import java.util.ArrayList;
import java.util.Iterator;
public class TestLoops
{
public static Iterator<Object> it;
public static ArrayList<Object> objects;
public static void main(String... args)
{
objects = new ArrayList<Object>();
it = objects.iterator();
it = objects.iterator();
//Every time we start a foreach loop, does it creates a new reference?
Iterator<Object> newIt1 = objects.iterator();
Iterator<Object> newIt2 = objects.iterator();
}
}
このバイトコードを生成します:
public class TestLoops {
public static java.util.Iterator<java.lang.Object> it;
public static java.util.ArrayList<java.lang.Object> objects;
public TestLoops();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String...);
Code:
0: new #2 // class java/util/ArrayList
3: dup
4: invokespecial #3 // Method java/util/ArrayList."<init>":()V
7: putstatic #4 // Field objects:Ljava/util/ArrayList;
10: getstatic #4 // Field objects:Ljava/util/ArrayList;
13: invokevirtual #5 // Method java/util/ArrayList.iterator:()Ljava/util/Iterator;
16: putstatic #6 // Field it:Ljava/util/Iterator;
19: getstatic #4 // Field objects:Ljava/util/ArrayList;
22: invokevirtual #5 // Method java/util/ArrayList.iterator:()Ljava/util/Iterator;
25: putstatic #6 // Field it:Ljava/util/Iterator;
28: getstatic #4 // Field objects:Ljava/util/ArrayList;
31: invokevirtual #5 // Method java/util/ArrayList.iterator:()Ljava/util/Iterator;
34: astore_1
35: getstatic #4 // Field objects:Ljava/util/ArrayList;
38: invokevirtual #5 // Method java/util/ArrayList.iterator:()Ljava/util/Iterator;
41: astore_2
42: return
}