2010-06-02 24 views
5

Si consideri il seguente codiceQuando vengono create/distrutte stringhe costanti?

public static void method(String[] srgs){ 
try{ 

}catch(){ 
System.out.println("Hello World" + "one");} 
catch(..){ 
System.out.println("Hello World" + "two");} 
catch(..){ 
System.out.println(getString());} 
} 
  1. Quando vengono queste stringhe create? Presumo che le stringhe verranno create quando si verifica un'eccezione in fase di esecuzione. La stringa viene creata in fase di esecuzione e viene visualizzata. Un mio pari mi dice che siccome queste stringhe sono costanti, verranno create non appena la classe verrà caricata. È corretto?

  2. Quando vengono raccolte le spazzature delle stringhe? Vengono raccolti dei rifiuti? Supponendo che lo stesso metodo possa essere richiamato più volte nei programmi di vita non ha senso solo memorizzarli nella cache?

risposta

6
  1. Questi archi sono infatti costante stringa e sarà in piscina costante della classe e quindi sarà istanziata nella JVM quando la classe viene caricata. Il fatto che siano creati con + non ha importanza, poiché l'intera stringa è ancora un'espressione costante (vale a dire sarebbe esattamente la stessa di quella che hai scritto "Hello Worldone" e "Hello Worldtwo"). Queste regole sono descritte in § 3.10.5 String Literals di JLS.

  2. String Gli oggetti sono garbage collection nello stesso modo in cui qualsiasi altro oggetto è garbage collection, non c'è nulla di intrinsecamente diverso in loro. Tuttaviasome String are interned (in particolare questo include tutti i valori letterali di stringa), che possono o meno impedire che vengano raccolti automaticamente (non definiti e dipendenti dall'implementazione).

    Finché la classe rimane caricata, quelle costanti di stringa rimarranno in vigore e non saranno raccolte.

+0

Grazie Joachim, si consideri SOP ("Hello World" + getstr()), in questo caso la stringa costante è ancora creata? Quando viene eseguita questa riga viene creata una seconda stringa? Viene raccolta la seconda stringa di garbage collection? Potete indicarmi una fonte da cui avete risposto al punto 1. – Geek

+1

Ho collegato la sezione pertinente del JLS. '" HelloWorld "+ getstr()' is ** not ** a 'String' literal ('anche se * contiene * uno:' "Hello World" '). Un nuovo oggetto 'String' viene prodotto ogni volta che viene eseguita la riga e che l'oggetto è garbage collection normalmente. –

+0

@JoachimSauer il caso di "HelloWorld" + getstr() 1 .Verrà ancora creato "HelloWorld" quando la classe viene caricata? 2. Abbiamo bisogno di usare cosa fare se non vogliamo impedire alla stringa di essere raccolta dati inutili, la nuova stringa ("HelloWorld") è d'aiuto? – Jaskey

Problemi correlati