2015-05-16 10 views
10

Beim Deklarieren eines Arrays in Java müssen wir den Speicher dynamisch mit einem neuen Schlüsselwort zuweisen.Java-Array-Initialisierung mit Nullgröße

class array 
{ 
    public static void main(String ars[]) { 
    int A[] = new int[10]; 
    System.out.println(A.length); 
    } 
} 

Der obige Code erstellt ein 1D-Array mit 10 Elementen, jeweils 4 Byte. und die Ausgabe wird 10 sein. Aber wenn Sie denselben Code ausführen, wie folgend:

class array { 
    public static void main(String ars[]) { 
    int A[] = new int[0]; 
    System.out.println(A.length); 
    } 
} 

Ausgang ist 0. Ich möchte wissen, dass, wenn Sie new int[0] schreiben dann tun Java etwas Speicher für das Array zuweisen oder nicht? Wenn ja wie viel?

Antwort

10

Ja, es reserviert etwas Speicher, aber der Betrag hängt von der JVM-Implementierung ab. Sie müssen irgendwie darstellen:

  1. Ein eindeutigen Zeiger (!, So dass das Array = jeden zweiten new int [0]), so mindestens 1 Byte
  2. Klasse Zeiger (für Object.getClass())
  3. Hash-Code (für System.identityHashCode)
  4. Object Monitor (für synchronisierte (Objekt))
  5. Array Länge

Die JVM verschiedene Optimierungen durchführen könnte (t ableiten er System-Hash-Code vom Objektzeiger, wenn er nicht GC/verschoben wurde, verwenden Sie ein einzelnes Bit, um ein nie-gesperrtes Objekt darzustellen, verwenden Sie ein einzelnes Bit, um ein leeres Array darzustellen, usw.), aber es hat immer noch um etwas Speicher zu reservieren.

Edit: Zum Beispiel, indem Sie die Schritte auf this post, berichtet meine JVM eine Größe von 16 für new int[0] vs 32 für new int[4].