Hi,
Sowohl dein, als auch (shame on me) mein Beispiel benutzen Literale - die gehen in den Pool. Wenn aber ein z.B.
aufgerufen wird, kann der vom Reader gelieferte String nicht zur Compilezeit aufgelöst werden und geht mit Sicherheit nicht in den Pool. Sobald keine Referenz auf diesen String zeigt, kann er von der GC abgeräumt werden.
Gruß
THMD
und ich bleibe dabei, dass das Quatsch ist. Nur Literale, also Strings die zur Compilezeit vom Compiler aufgelöst werden können, gehen in den Pool, sowie Strings, auf denen zur Laufzeit intern() aufgerufen wird. String die erst zur Laufzeit aufgelöst werden können, gehen nicht in den Pool....
IMHO ist mccaes Aussage korrekt, dass sämtliche Strings im Constant Pool der JVM abgelegt werden. Du hast insofern recht, dass ein mit new String("blablubb") erzeugtes Objekt vom GC eingesammelt wird. Das zugehörige Literal "blablubb" jedoch bleibt im Pool, genau wie alle anderen erzeugten Strings. Nimm z.B....
Sowohl dein, als auch (shame on me) mein Beispiel benutzen Literale - die gehen in den Pool. Wenn aber ein z.B.
Code:
String str = reader.readLine();
Wie gesagt, wenn es stimmen würde, dass alle Strings im Speicher bleiben, würden viele Java Anwendungen mit OutOfMemory abrauchen.Dies hat natürlich zur Folge, dass sämtliche nicht mehr verwendete bzw. referenzierte Strings (gerade bei so großen Strings, von denen hier die Rede war) unnötig Resourcen verbrauchen.
Gruß
THMD