2009-07-02 45 views
2

私は配列を持っている場合は言う - そのコレクションをするとき
int[] a = new int[10];gc質問:10個の整数、1個のオブジェクトまたは10個のオブジェクトの配列?

JavaのGCは、10個のオブジェクトまたは単一のオブジェクトとしてそれを見ていますか?

更新:
ので、与えられた答えによると、GCの観点からそれを見て、代わりに

List l; 
for(i =0;i<1000;i++) 
    l.add(new MyObj(343,"asdfasfd")); 

の私たちがやるべきこと、それがより効率的にイマイチ -

int[] a; String[] b; 
for(i =0;i<1000;i++) { 
    a[i]=343; 
    b[i] = "asfasfsafsaf"; 
} 

理由最初のケースでは1000個の余分なオブジェクトを作成しますが、2番目のケースではそうではありません。

答えて

10

これは単一のオブジェクトです。配列は1つの連続したオブジェクトであり、intはオブジェクト型ではないプリミティブ型なので、10 intに対して作成されたオブジェクトはありません。 10個のオブジェクトプラス配列:あなたは10のObjectの配列を持っていた場合

// 1 object 
int[] intArray = new int[10]; 

その後、11個のオブジェクトがあると思います。配列自体は単なる単一のオブジェクトです。他の10個のオブジェクトへの参照が含まれているだけです。

// 1 object... 
Object[] objectArray = new Object[10]; 

// ...Plus 1 for each element once they are instantiated. 
for (int i = 0; i < 10; ++i) { 
    objectArray[i] = new Object(); 
} 
3

ガベージコレクションに関しては、配列は単一のオブジェクトです。 intのようなプリミティブ型の配列の場合は、オブジェクトが1つしかなく、配列全体がGCであるか、まったく同じではありません。

Objectの配列を持つ場合は、配列の1つのオブジェクトであり、配列で参照される参照型のオブジェクトが最大10個です(したがって、参照の配列には最大11個オブジェクト)。オブジェクトの1つを配列から削除する場合は、nullに設定するか、別のオブジェクトで上書きし、そのオブジェクトが他の変数によって参照されていない場合は、ガベージコレクションの対象となります。例:

Object a = new Object(); // "Our Object" 
Object[] array = new Object[10]; 
array[0] = a; 
a = null; // a no longer references our Object 
// now array[0] is the only reference to our Object 
// and it isn't eligible for garbage collection yet 
array[0] = null; 
// Now our Object is eligible for garbage collection 
3

(の意味で、最初のケースは、実際にガベージコレクトに高価であるかどうかを教えてくれます1)本当の答えは、私よりも、ガベージコレクタがかなり良く知っている誰かを取ります。

ガベージコレクタを偽造しようとするのは本当に重要ですか? StringMyObjectのライフサイクルはほとんど同じで、GCはかなりスマートです。ガベージコレクション時間をわずかに改善できる可能性がありますが、両方の配列を手動で管理する必要があります。つまり、基本的にOOをあきらめることは、コードの複雑さとバグの厄介な増加です。

+0

私は同意します - GCの仕事を本当に困難にするオブジェクトの数十億*の売上高を持っていない限り - それを台無しにしないでください。 –

関連する問題