Können wir Standard-Array-Werte in Java annehmen? Angenommen, ein int-Array ist auf alle Nullen gesetzt.

77

Kann ich in der Praxis davon ausgehen, dass alle int-Arrays in Java mit Nullen gefüllt beginnen? für alle Maschinen, auf denen die JVM läuft?

Gilt das für alle Typen? verkohlen? Boolescher Wert? Aufzählungen?

Wo ist das offiziell dokumentiert?

In den Lehrbüchern, die ich habe, heißt es, dass int-Arrays auf Null gesetzt sind, aber sie empfehlen auch, eine for-Schleife zu schreiben, um alle Werte auf Null zu setzen, nur "um klarer zu sein".

Jose M Vidal
quelle
14
Wirf diese Lehrbücher weg. Im schlimmsten Fall hätten sie dir sagen sollen, du sollst anrufen Arrays.fill(myArr, 0). Aber es ist immer noch ein lächerlicher Vorschlag. Wenn es um Klarheit geht, geben Sie einen verdammten Kommentar ein. Machen Sie keine unnötige Arbeit.
Mark Peters
6
Die Java-Sprache garantiert, dass Variablen auf einen Standardwert initialisiert werden (false, 0, null, je nach Typ). Es ist nicht erforderlich, ein Array manuell zu initialisieren, es ist nur eine Verschwendung von CPU-Zyklen.
Steve Kuo
1
Diese Lehrbücher wurden wahrscheinlich von C / C ++ - Programmierern geschrieben, für die neu zugewiesene Arrays undefinierten Inhalt haben. Java ist bemüht, undefiniertes Verhalten zu vermeiden.
Raedwald
Dies ist der Fall, wenn C / C ++ - Lehrer vom Lehrstuhl ohne zusätzliche Schulung beauftragt werden, eine Java-Klasse zu unterrichten. Der Autor war möglicherweise sogar Schüler eines solchen Lehrers ... und hier sprechen wir veraltete Annahmen an.
Jason K.

Antworten:

138

Die Java-Sprachspezifikation ist der richtige Ort, um nach solchen Informationen zu suchen:

Array-Komponenten sind unbenannte Variablen, die erstellt und auf Standardwerte (§4.12.5) initialisiert werden, wenn ein neues Objekt erstellt wird, das ein Array ist

Die Standardwerte selbst sind in Abschnitt 4.12.5 angegeben .

  • Für den Typ Byte 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, dh 0 .
  • Für Typ long ist der Standardwert Null, dh 0L .
  • Für den Typ float ist der Standardwert positiv Null, dh 0.0f .
  • Für den Typ double ist der Standardwert positiv Null, dh 0.0d .
  • Für den Typ char ist der Standardwert das Nullzeichen, dh '\ u0000' .
  • Für den Typ Boolean ist der Standardwert false .
  • Für alle Referenztypen ist der Standardwert null .
Nikita Rybak
quelle
Können Sie das Nullzeichen als Null behandeln? rechnerisch?
committedandroider
Gute Antwort. War selbst neugierig darauf.
ktm5124
17

Ja. Primitive Typen in Java werden immer mit Null initialisiert. Referenzen werden ebenfalls auf null initialisiert.

Etienne de Martel
quelle
4
+1 und für die Aufzeichnung, hier ist die offizielle Spezifikation: Anfangswerte von Variablen
casablanca
2
Dies gilt für Array-Werte und -Felder, jedoch nicht für lokale Variablen. Der Compiler verlangt, dass Sie diese selbst initialisieren.
Matthew Flaschen
Boolean wird auf false und nicht auf null initialisiert.
Steve Kuo
7

Es sollte sich um eine Java-Sprachspezifikation handeln. §4.12.5 Anfangswerte von Variablen . anstelle von §4.5.5

"Für Typ Byte ist der Standardwert Null, dh der Wert von (Byte) 0.
Für Typ Short ist der Standardwert Null, dh der Wert von (Kurz) 0.
Für Typ Int ist der Standardwert ist Null,
dh 0. Für den Typ long ist der Standardwert Null, dh 0L.
Für den Typ float ist der Standardwert positiv Null, dh 0.0f.
Für den Typ double ist der Standardwert positiv Null Das heißt, 0.0d.
Für den Typ char ist der Standardwert das Nullzeichen, dh '\ u0000'.
Für den Typ boolean ist der Standardwert false.
Für alle Referenztypen (§4.3) ist der Standardwert Null."

user1804314
quelle
4

Dein Lehrbuch ist falsch! Das Schreiben eines solchen Codes ist sinnlos und es ist eine Verschwendung Ihrer Zeit, ihn einzugeben, und der Computerzeit, ihn auszuführen.

Wie bereits erwähnt, garantiert der Compiler, dass Variablen außerhalb von Methoden (Klassen- / Instanzvariablen) den Wert 0, false oder null erhalten. Wie Sie wahrscheinlich wissen, gibt der Compiler keine Variablen innerhalb von Methodenwerten an und zwingt Sie stattdessen, ihnen einen Wert zu geben, bevor sie verwendet werden.

Wenn Sie die Dinge "richtig" machen, werden Sie feststellen, dass sich etwa 90% bis 95% Ihrer "Variablen" niemals ändern, nachdem ihnen ein Wert zugewiesen wurde. Neue Programmierer neigen jedoch dazu, solche Dinge zu tun:

int x = 0;

// some code that never uses x

x = 5;

// more code that only reads x and never modifies it.

Dies verhindert, dass Sie x als "final" markieren können. Wenn Sie x als "final" markieren können, wird eine versehentliche Änderung des Werts verhindert, wodurch Fehler vermieden werden.

Ich würde den Code wie folgt schreiben:

final int x;

// some code that never uses x

x = 5;

// more code that only reads x and never modifies it.

Dies wird als leeres Finale bezeichnet (eine endgültige Variable, die beim Deklarieren keinen Wert hat).

Wenn Sie sich daran erinnern, dass Klassen- / Instanzvariablen zur Laufzeit initialisiert werden, schreiben Sie hoffentlich keinen Code, um sie mit Wegwerfwerten zu initialisieren, und können sie dann als endgültig markieren.

Meine persönliche Praxis besteht darin, alles immer als endgültig zu markieren, bis ich feststelle, dass ich es ändern muss, und eine Variable niemals zu initialisieren, bis ich den tatsächlichen Wert kenne, den sie haben soll. Dadurch wird der Code schneller (nicht erkennbar, da Zuweisungen im Allgemeinen sehr schnell sind) und sicherer, da ich einen Wert selten versehentlich ändere, wenn ich dies nicht sollte.

TofuBeer
quelle