haben Sie einen Blick auf die Byte-Code mit javap -c [ClassName]
. Hier ist eine Klasse, die einige Beispiele von Variablen für den Einmalgebrauch mit Schleifen zeigt. Das entsprechende Bytecode-Dump ist in den Kommentaren:
class HelloWorldLoopsAnnotated {
//
// HelloWorldLoopsAnnotated();
// Code:
// 0: aload_0
// 1: invokespecial #1; //Method java/lang/Object."<init>":()V
// 4: return
////////////////////////////////////////////////////////////////////////////
void stringDeclaredInsideLoop(){
while (true) {
// 0: ldC#2; //String Hello World!
String greeting = "Hello World!";
doNothing(greeting);
}
}
//
// void stringDeclaredInsideLoop();
// Code:
// 0: ldC#2; //String Hello World!
// 2: astore_1
// 3: aload_0
// 4: aload_1
// 5: invokespecial #3; //Method doNothing:(Ljava/lang/String;)V
// 8: goto 0
////////////////////////////////////////////////////////////////////////////
void stringDeclaredOutsideLoop(){
String greeting;
while (true) {
greeting = "Hello World!";
doNothing(greeting);
}
}
//
// void stringDeclaredOutsideLoop();
// Code:
// 0: ldC#2; //String Hello World!
// 2: astore_1
// 3: aload_0
// 4: aload_1
// 5: invokespecial #3; //Method doNothing:(Ljava/lang/String;)V
// 8: goto 0
////////////////////////////////////////////////////////////////////////////
void stringAsDirectArgument(){
while (true) {
doNothing("Hello World!");
}
}
// void stringAsDirectArgument();
// Code:
// 0: aload_0
// 1: ldC#2; //String Hello World!
// 3: invokespecial #3; //Method doNothing:(Ljava/lang/String;)V
// 6: goto 0
////////////////////////////////////////////////////////////////////////////
private void doNothing(String s) {
}
}
stringDeclaredInsideLoop()
und stringDeclaredOutsideLoop()
Ausbeute identisch sechs Anweisung Bytecode. stringDeclaredInsideLoop()
gewinnt immer noch: begrenzten Bereich ist am besten.
Nach einigem Nachdenken kann ich nicht wirklich sehen, wie verkleinerte Umfang Leistung jemals beeinflussen würde: identische Daten im Stapel würden identische Anweisungen erfordern.
stringAsDirectArgument()
definiert jedoch die Operation in nur vier Anweisungen. Umgebungen mit wenig Arbeitsspeicher (z. B. mein prächtig dummes Telefon) mögen die Optimierung zu schätzen wissen, während ein Kollege, der Ihren Code liest, dies möglicherweise nicht tut, also üben Sie vor dem Rasieren von Bytes aus Ihrem Code ein Urteil.
Weitere Informationen finden Sie unter .
Diese Antwort ist irreführend, da es bedeutet, dass die Referenzvariable einmal bei jeder Iteration zugeordnet wird, was * nicht * wahr ist. –
@BlueRaja - Danny Pflughoeft: Wie ich in meiner Antwort gesagt habe, ist es lediglich eine * Referenz * auf ein Objekt zu erstellen, nicht das ganze Objekt selbst zuzuordnen. Deshalb ist die Menge an Speicher sehr klein - weil nur die wenigen Bytes, die für die Referenz benötigt werden, beteiligt sind. – MAK
Ja, ich verstehe; aber selbst diese Referenz (der Zeiger selbst) wird nur einmal zugewiesen, was im Gegensatz zu dem steht, was die Phrase * "Zuweisung/Freigabe der Zuweisung sollte Ihr Programm nicht signifikant beeinflussen" * impliziert. –