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;
War es hilfreich?

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 Variable a ist ein Feld, mit dem alle Methoden in der Klasse.
  • In Class2 dies nicht der Fall ist: a ist eine lokale Variable innerhalb der Methode assign. Nach assign beendet ist, wird der Wert von a 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top