In C/C++
Früher habe ich tun
int arr[10] = {0};
... um alle meine Array-Elemente auf 0 zu initialisieren.
Gibt es eine ähnliche Verknüpfung in Java?
Ich möchte die Verwendung der Schleife vermeiden. Ist das möglich?
int arr[] = new int[10];
for(int i = 0; i < arr.length; i++) {
arr[i] = 0;
}
Antworten:
Ein Standardwert von 0 für Arrays integraler Typen wird durch die Sprachspezifikation garantiert :
Wenn Sie ein eindimensionales Array mit einem anderen Wert initialisieren möchten, können Sie java.util.Arrays.fill () verwenden (wobei natürlich intern eine Schleife verwendet wird).
quelle
Arrays.fill
verwendet nicht unbedingt eine Schleife.Während die anderen Antworten korrekt sind (int-Array-Werte werden standardmäßig auf 0 initialisiert), können Sie die fill () -Methode von verwenden, wenn Sie dies explizit tun möchten (z. B. wenn Sie beispielsweise ein Array mit dem Wert 42 möchten) die Arrays- Klasse:
Oder wenn Sie ein Fan von 1-Liner sind, können Sie die
Collections.nCopies()
Routine verwenden:Würde arr den Wert geben:
(obwohl dies der Fall
Integer
ist und nichtint
, wenn Sie den primitiven Typ benötigen, können Sie die Apache Commons-ArrayUtils.toPrimitive()
Routine verwenden:quelle
List<Integer>
zuInteger[]
zuint[]
? Das ist ein bisschen verworren.Arrays.fill
Methode führt zu Problemen und Fehlern.In Java alle Elemente (primitive Typen integer
byte
short
,int
,long
) sind standardmäßig auf 0 initialisiert. Sie können die Schleife speichern.quelle
Wie reduziert es die Leistung Ihrer Anwendung ....? Lesen Sie Folgendes.
In der Java-Sprachspezifikation den Standard- / Anfangswert für jedes Objekt wie folgt angegeben werden.
Für Typ - Byte , der Standardwert ist Null , das heißt, ist der Wert von (Byte) 0 .
Für Typen Kurz der Standardwert ist Null , das heißt, ist der Wert von (kurzen) 0 .
Für den Typ int , der Standardwert ist Null , das heißt, 0 .
Für Typ lange der Standardwert ist Null , das heißt, 0L .
Für Typ float , der Standardwert ist positiv Null , das ist 0.0f .
Für Typ double , der Standardwert ist positiv Null , das heißt, 0.0d .
Für Typ char ist der Standardwert das Nullzeichen , dh ' \ u0000 '.
Für den Typ boolean , der Standardwert ist falsch .
Zum alle Referenztypen , der Standardwert ist null .
Wenn Sie all dies berücksichtigen, müssen Sie nicht mit Nullwerten für die Array-Elemente initialisieren, da standardmäßig alle Array-Elemente für das int-Array 0 sind.
Weil ein Array ein Containerobjekt ist, das eine feste Anzahl von Werten eines einzelnen Typs enthält. Nun ist der Array-Typ für Sie int. dass der Standardwert für alle Array-Elemente automatisch 0 ist , da er den Typ int enthält .
Nun betrachten Sie die Array für String - Typen , so dass alle Array - Elemente haben Standardwert ist null .
Warum machst du das nicht ......?
Sie können einen Nullwert zuweisen, indem Sie die Schleife verwenden, wie Sie in Ihrer Frage vorschlagen.
Wenn Sie dies jedoch tun, führt dies zu einem nutzlosen Verlust des Maschinenzyklus. Wenn Sie in Ihrer Anwendung viele Arrays verwenden und dies für jedes Array tun, wirkt sich dies auf die Anwendungsleistung bis zu einem erheblichen Grad aus.
Je mehr Maschinenzyklus verwendet wird ==> Mehr Zeit für die Verarbeitung der Daten ==> Die Ausgabezeit wird erheblich verlängert . Damit kann Ihre Anwendungsdatenverarbeitung als niedrige Stufe betrachtet werden (bis zu einer gewissen Stufe verlangsamen).
quelle
Sie können die Schleife speichern, die Initialisierung erfolgt bereits auf 0. Auch für eine lokale Variable.
Bitte korrigieren Sie die Stelle, an der Sie die Klammern platzieren, zur besseren Lesbarkeit (anerkannte Best Practice):
quelle
Wenn Sie Float oder Integer verwenden, können Sie einen Standardwert wie diesen zuweisen ...
quelle
Sie können ein neues leeres Array mit Ihrer vorhandenen Arraygröße erstellen und es Ihrem Array zurückweisen. Dies kann schneller als andere sein. Snipet:
Ergebnis:
quelle
Ja, int-Werte in einem Array werden auf Null initialisiert. Dies ist Ihnen jedoch nicht garantiert. In der Oracle-Dokumentation heißt es, dass dies eine schlechte Codierungspraxis ist.
quelle
Die int-Werte sind nach der Initialisierung bereits Null, wie alle erwähnt haben. Wenn Sie in einer Situation tatsächlich Array-Werte auf Null setzen müssen und diese optimieren möchten, verwenden Sie
System.arraycopy
:Dies wird
memcpy
in den meisten oder allen JRE-Implementierungen unter dem Deckmantel verwendet. Beachten Sie, dass die Verwendung einer solchen Statik auch bei mehreren Threads sicher ist, da im schlimmsten Fall die Neuzuweisung mehrerer Threads erfolgtzeros
gleichzeitig zugewiesen werden, was nichts schadet.Sie können auch verwenden,
Arrays.fill
wie einige andere erwähnt haben.Arrays.fill
könnte gebrauchenmemcpy
in einem Smart - JVM, aber es ist wahrscheinlich nur eine Java - Schleife und die Grenzen, was dazugehört zu überprüfen.Benchmarking Ihrer Optimierungen natürlich.
quelle
Noch ein Ansatz mit Lambda über Java 8
quelle
In c / cpp gibt es keine Verknüpfung, um alle Arrays mit dem Index Null zu initialisieren. Beispiel:
In Java gibt es jedoch ein magisches Werkzeug namens Arrays.fill (), das alle Werte in einem Array mit der Ganzzahl Ihrer Wahl füllt. Beispiel:
quelle
Die Initialisierung ist bei Null nicht erforderlich, da der Standardwert von int in Java Null ist. Für andere Werte als Null stehen
java.util.Arrays
eine Reihe von Optionen zur Verfügung. Die einfachste ist die Füllmethode.Wir können auch Arrays.setAll () verwenden, wenn wir den Wert auf Bedingungsbasis füllen möchten:
quelle
Deklarieren Sie das Array als Instanzvariable in der Klasse, dh aus jeder Methode heraus, und JVM gibt ihm 0 als Standardwert. Sie brauchen sich keine Sorgen mehr zu machen
quelle
Ergebnis 0123456 -1012345 -2-101234 -3-2-10123 -4-3-2-1012 -5-4-3-2-101 -6-5-4-3-2-10
quelle