Es würde wahrscheinlich helfen, die Syntax hinter der for-Schleife zu verstehen. Das wird in der JLS Section 14.14.1 diskutiert.
BasicForStatement:
for (ForInitopt ; Expressionopt ; ForUpdateopt) Statement
...
Statement:
StatementWithoutTrailingSubstatement
...
StatementWithoutTrailingSubstatement:
Block
EmptyStatement
ExpressionStatement
...
Block:
{ BlockStatementsopt }
BlockStatements:
BlockStatement
BlockStatements BlockStatement
BlockStatement:
LocalVariableDeclarationStatement
ClassDeclaration
Statement
Statement, wie immer, kann eine einzelne Anweisung oder ein Block (Anweisungen mit geschweiften Klammern) sein. Ein Block stellt einen neuen lexikalischen Geltungsbereich dar, und darin deklarierte Variablen sind nur für diesen Block lokal. Was viele Leute nicht wissen, ist das nicht nur für die For-Schleife. Ich kann eine Blockanweisung überall in einer Methode setzen:
public void someMethod() {
{
List<String> myList = new ArrayList<String>();
System.out.println(myList);
}
System.out.println(myList.size()); //compile error: myList out of scope
}
Wie auch immer, das geht nicht dahin, wo ich es wollte.Es genügt zu sagen, dass es weniger damit zu tun hat, dass es eine Schleife ist und mehr damit zu tun hat, dass es ein Block ist (wenn Sie keine Blockanweisung verwenden, können Sie keine neuen lokalen Variablen deklarieren, so dass das Problem besteht) irrelevant).
Ich glaube, er ist mehr besorgt, dass Objekte in vorherigen Iterationen der Schleife zu 'myList' zugewiesen wird GC'd sein, auch wenn noch in der Schleife. Nicht nach der Schleife. –
Guter Punkt, ich aktualisierte die Antwort, um das zu adressieren. –
Ich weiß nicht, ob diese Antwort vollständig genug ist. Zuerst werden Ganzzahlen und andere Werttypen auf dem Stapel zugeordnet und haben nichts mit der Speicherbereinigung zu tun. Zweitens kann myList für die Garbage Collection geeignet sein oder auch nicht. Es hängt davon ab, ob eine andere Referenz irgendwo anders in Ihrem Code gespeichert ist oder nicht. –