Frage
Edited diese Frage wegen meiner schlechten Beispiele .. Hier ist meine Frage aktualisiert:
würde die folgende in Geschwindigkeit und Speicherzuweisung gleich:
int b;
for (int i = 0; i < 1000; i++)
b = i;
und
for (int i = 0; i < 1000; i++)
int b = i;
Lösung
Nein, es würde nicht.
Im ersten Fall, dass Sie eine Variable haben werden zugewiesen 1000 verschiedene Werte -. Und Sie halten den letzten Wert in der Lage, am Ende zu bekommen (999), nachdem der Konstruktor abgeschlossen
Im zweiten Fall Sie anrufen ein im wesentlichen nicht-op Verfahren 1000mal. Das zweite Verfahren hat keine Nebenwirkungen und hat keinen Rückgabewert, so dass es sinnlos ist. Die lokale Variable „existiert“ nur für die Dauer des Methodenaufrufes, während das Instanz-Variable in dem ersten Beispiel Teil des Objekts ist, wird so weiterleben.
Beachten Sie, dass dies nicht auf Primitiven beschränkt -. Jede andere Art zu auf die gleiche Weise verhalten würde
Andere Tipps
- Ja. Beide sind völlig nutzlos.
- Nein. Instanzgröße von Class1 größer ist als Beispiel einer Größe von Klasse 2, aufgrund der Membervariable.
Die Antwort hängt davon ab, was Sie mit den Worten „gleich“ =)
Nein .
- In
Class1
die Variablea
ist ein Feld, mit dem alle Methoden in der Klasse. - In
Class2
dies nicht der Fall ist:a
ist eine lokale Variable innerhalb der Methodeassign
. Nachassign
beendet ist, wird der Wert vona
verworfen.
Nein, man hat eine Instanzvariable a
(Class1), und man hat es nicht.
Im ersten Fall haben Sie bereits erklärt b als int und dessen Wert aktualisiert wird jedes Mal die Schleife ausgeführt. In dem zweiten, b wird erklärt und auf den Wert von i jedes Mal der Schleife ausgeführt initialisiert. Ich bin nicht 100% sicher, aber ich denke, dass der zweite Fall mehr speicherintensiv ist, aber ich glaube nicht, dass die Geschwindigkeitsdifferenz auffallen würde.
Es ist erwähnenswert, dass jeder Compiler wert sein Salz, und ich fest der JIT glauben wert viel Salz zu sein, würde sich etwas beiseite Platz für „b“ ONCE im zweiten Fall, dh die ‚Erklärung‘ Phase wäre sinnlos .
Haben Sie das ausprobiert? Es ist nicht einmal kompilieren!
for (int i = 0; i < 1000; i++)
int b = i;
Fehlermeldungen des Compilers:
Example.java:4: '.class' expected
int b = i;
^
Example.java:4: not a statement
int b = i;
^
Example.java:4: illegal start of expression
int b = i;
^
Der Körper einer Schleife muss mindestens eine Anweisung enthalten. Eine Variablendeklaration ist keine Aussage, so dass eine Schleife mit nur einer Variablendeklaration ist ungültig.