Was ist die Standardinitialisierung eines Arrays in Java?

144

Also deklariere und initialisiere ich ein int-Array:

static final int UN = 0;
int[] arr = new int[size];
for (int i = 0; i < size; i++) {
    arr[i] = UN;
}

Sagen Sie, ich mache das stattdessen ...

int[] arr = new int[5];
System.out.println(arr[0]);

... 0wird nach Standard gedruckt. Auch wenn ich das mache:

static final int UN = 0;
int[] arr = new int[5];
System.out.println(arr[0]==UN);

... truewird nach Standard gedruckt. Wie initialisiert Java mein Array standardmäßig? Ist es sicher anzunehmen, dass die Standardinitialisierung das Festlegen der Array-Indizes ist, 0was bedeuten würde, dass ich das Array nicht durchlaufen und initialisieren muss?

Vielen Dank.

Hristo
quelle
6
Lesen Sie einfach die Dokumente;) docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5
Benj

Antworten:

281

Alles in einem Java-Programm, das vom Programmierer nicht explizit auf etwas gesetzt wurde, wird auf einen Nullwert initialisiert.

  • Für Referenzen (alles, was ein Objekt enthält) null.
  • Für int / short / byte / long ist das a 0.
  • Für float / double ist das a 0.0
  • Für Boolesche Werte ist das a false.
  • Für char ist dies das Nullzeichen '\u0000'(dessen Dezimaläquivalent 0 ist).

Wenn Sie ein Array von etwas erstellen, werden auch alle Einträge auf Null gesetzt. So Ihr Array fünf Nullen enthält Recht , nachdem es erstellt durchnew .

Hinweis (basierend auf Kommentaren): Die Java Virtual Machine muss beim Zuweisen lokaler Variablen den zugrunde liegenden Speicher nicht auf Null setzen (dies ermöglicht bei Bedarf effiziente Stapeloperationen). Um zufällige Werte zu vermeiden, müssen in der Java-Sprachspezifikation lokale Variablen initialisiert werden.

Thorbjørn Ravn Andersen
quelle
Kommentare sind nicht für eine ausführliche Diskussion gedacht. Dieses Gespräch wurde in den Chat verschoben .
Brad Larson
Alles außer lokalen Variablen, die nicht mit irgendetwas initialisiert sind, wie der Compiler Ihnen sagen wird.
Marquis von Lorne
@ user207421 wie am Ende der Antwort erwähnt.
Thorbjørn Ravn Andersen
Dies bedeutet, dass der erste Satz Ihrer Antwort nicht korrekt ist und geändert werden sollte. Und Ihre Frage „Woher wissen Sie das?“ Im Chat ist bedeutungslos. Die JLS sagen es, das ist es, und der Compiler erzwingt es ebenso.
Marquis von Lorne
@ user207421 "vom Programmierer nicht explizit auf etwas gesetzt" (dies kann vom Compiler verlangt werden).
Thorbjørn Ravn Andersen
60

Aus der Java-Sprachspezifikation :

  • Jede Klassenvariable, Instanzvariable oder Array-Komponente wird beim Erstellen mit einem Standardwert initialisiert (§15.9, §15.10):

    • Für Typbyte ist der Standardwert Null, dh der Wert von (byte)0.
    • Für den Typ short ist der Standardwert Null, dh der Wert von (short)0.
    • Für den Typ int ist der Standardwert Null, d 0. H.
    • Für Typ long ist der Standardwert Null, d 0L. H.
    • Für den Typ float ist der Standardwert positiv Null, d 0.0f. H.
    • Für Typ double ist der Standardwert positiv Null, d 0.0d. H.
    • Für den Typ char ist der Standardwert das Nullzeichen, d '\u0000'. H.
    • Für den Typ Boolean ist der Standardwert false.
    • Für alle Referenztypen (§4.3) ist der Standardwert null.
Dave Costa
quelle
2
Und was ist mit Array of Long s und Integer s?
Georgy Dobrev
1
@GeorgyDobrev. Das sind Referenztypen. Sie wären gemäß der obigen Spezifikation null.
Dave Costa
Was ist mit einem String-Array?
Zac
1
@Zac Wie oben ist ein String ein Objekt, daher wäre der Standardwert im Array null.
Dave Costa
18

JLS sagt klar

Ein Array-Initialisierer erstellt ein Array und stellt Anfangswerte für alle seine Komponenten bereit.

und dies ist unabhängig davon, ob das Array eine Instanzvariable oder eine lokale Variable oder eine Klassenvariable ist.

Standardwerte für primitive Typen: docs

Für Objekte sind die Standardwerte null.

Aniket Thakur
quelle
1
Beantwortet die Frage nicht. Er fragt nach der Standardinitialisierung.
Marquis von Lorne
3

Laut Java

Datentyp - Standardwerte

Byte - 0

kurz - 0

int - 0

lang - 0L

float - 0.0f

doppelt - 0.0d

char - '\ u0000'

String (oder ein beliebiges Objekt) - null

Boolescher Wert - falsch

Abhishek Singh
quelle
2
Er fragt nicht nach Feldern, er fragt nach Array-Komponenten.
Marquis von Lorne
3
@EJP Kannst du bitte näher erläutern, was unter Array-Komponente zu verstehen ist? Im Allgemeinen hat das Array einen Datentyp (den gleichen Typ), der wie oben initialisiert ist. Kannst du mir bitte sagen, Mittelwert der Komponente?
Abhishek Singh
3

Thorbjørn Ravn Andersen antwortete für die meisten Datentypen. Da es eine hitzige Diskussion über Array gab,

Zitieren aus der jls-Spezifikation http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 "Array-Komponente wird beim Erstellen mit einem Standardwert initialisiert"

Ich denke, unabhängig davon, ob Array lokal oder Instanz oder Klassenvariable ist, wird es mit Standardwerten

nantitv
quelle
2

Jede Klasse in Java hat einen Konstruktor (ein Konstruktor ist eine Methode, die aufgerufen wird, wenn ein neues Objekt erstellt wird, das die Felder der Klassenvariablen initialisiert). Wenn Sie also eine Instanz der Klasse erstellen, wird beim Erstellen des Objekts die Konstruktormethode aufgerufen, und alle Datenwerte werden zu diesem Zeitpunkt initialisiert.

Für Objekte vom Typ Integer Array werden alle Werte im Array in der Konstruktormethode auf 0 (Null) initialisiert. In ähnlicher Weise werden für ein Objekt eines booleschen Arrays alle Werte mit false initialisiert.

Daher initialisiert Java das Array, indem es beim Erstellen des Objekts seine Konstruktormethode ausführt

kkk
quelle
1

Java gibt an, dass die Standardlänge eines JAVA-Arrays zum Zeitpunkt der Initialisierung 10 beträgt.

private static final int DEFAULT_CAPACITY = 10;

Die size()Methode gibt jedoch die Anzahl der eingefügten Elemente im Array zurück. Wenn Sie zum Zeitpunkt der Initialisierung kein Element in das Array eingefügt haben, wird Null zurückgegeben.

private int size;

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

public void add(int index, E element) {
    rangeCheckForAdd(index);
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    System.arraycopy(elementData, index, elementData, index + 1,size - index);
    elementData[index] = element;
    size++;
}
RAJIV GUPTA
quelle
2
Dies sieht aus wie ArrayList, kein Array.
Thorbjørn Ravn Andersen