2009-07-02 6 views
2

Wenn ich ein Array sagen -, dass als 10 Objekte oder ein einzelnes Objekt
int[] a = new int[10];gc Frage: Array von 10 ints ein einzelnes Objekt oder 10 Objekte?

die Java GC tut, wenn seine Sammlung zu tun?

Update:
so die Antworten nach, um es von einer GC Perspektive suchen war nicht es effizienter, dass anstelle von

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

sollten wir tun -

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

weil Im ersten Fall erstellen wir 1000 zusätzliche Objekte, im zweiten Fall nicht.

Antwort

10

Das ist ein einzelnes Objekt. Ein Array ist ein zusammenhängendes Objekt und int ist ein primitiver Typ, kein Objekttyp, daher werden keine Objekte für die 10 int s erstellt.

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

Wenn Sie ein Array von 10 Object s hatte, dann würde es 11 Objekte sein: die 10 Objekte plus der Array. Das Array selbst ist immer noch ein einzelnes Objekt; Es enthält zufällig Referenzen auf 10 andere Objekte.

// 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

In Bezug auf Garbage Collection ist das Array ein einzelnes Objekt. Wenn es sich um ein Array von primitiven Typen wie int handelt, dann ist nur ein Objekt beteiligt, und entweder das gesamte Array ist GC'd, oder keines davon ist.

Wenn Sie ein Array von Referenztypen haben, z. B. Object, dann ist dies ein Objekt für das Array plus bis zu 10 Objekte für die vom Array referenzierten Referenztypen (ein Array mit 10 Referenzen kann also bis zu 11 umfassen) Objekte). Wenn Sie eines der Objekte aus dem Array entfernen, z. B. indem Sie es auf null setzen oder es mit einem anderen Objekt überschreiben, und vorausgesetzt, dass das Objekt von keiner anderen Variablen referenziert wird, wird es für die Garbage Collection geeignet. Beispiel:

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

Eine wirkliche Antwort (im Sinne von, eine, die Ihnen sagen würde, ob der erste Fall zu Müll-collect tatsächlich teurer ist) würde jemanden nehmen, die die Garbage Collector besser viel wissen, als ich .

Aber ist es wirklich so wichtig zu versuchen, den Garbage Collector zu fälschen? Die Lebenszyklen der String s und MyObject s werden ziemlich gleich sein, und GC ist ziemlich schlau. Es ist nur möglich, dass Sie Ihre Garbage-Collection-Zeit etwas verbessern können, aber was Sie dafür bezahlen, dass Sie beide Arrays manuell managen müssen - im Grunde geben Sie OO auf - ist eine böse Zunahme der Code-Komplexität und der wahrscheinlichen Fehler.

+0

Ich stimme zu - es sei denn, Sie haben einen Umsatz von * Milliarden * von Objekten, die Ihre GC wirklich hart arbeiten lassen - machen Sie sich nicht damit herum. –