2010-09-06 22 views
14

Qual è la differenza tra String str = new String("SOME") e String str="SOME" Queste dichiarazioni offrono una variazione delle prestazioni.Dichiarazione stringa Java

+0

Vedere anche http://stackoverflow.com/questions/334518/java-strings-string-s-new-stringsilly e http://stackoverflow.com/questions/390703/what-is-the-purpose-of -the-expression-new-string-in-java – polygenelubricants

risposta

29
String str = new String("SOME") 

creare sempre un nuovo oggetto sul mucchio

String str="SOME" 

utilizza il String pool

Prova questo piccolo esempio:

 String s1 = new String("hello"); 
     String s2 = "hello"; 
     String s3 = "hello"; 

     System.err.println(s1 == s2); 
     System.err.println(s2 == s3); 

Per evitare la creazione di oggetti inutili negli all'uso mucchio la seconda forma.

9

C'è una piccola differenza tra entrambi.

seconda dichiarazione assignates il riferimento associato alla costante SOME alla variabile str

prima dichiarazione crea una nuova stringa avente per valore il valore della costante SOME e assignates suo riferimento alla variabile str.

Nel primo caso, è stata creata una seconda stringa con lo stesso valore di SOME che implica più tempo di inizializzazione. Di conseguenza, dovresti evitarlo. Inoltre, al momento della compilazione, tutte le costanti SOME vengono trasformate nella stessa istanza, che utilizza molta meno memoria.

Di conseguenza, preferisco sempre la seconda sintassi.

+3

Per il record, ci sono scenari in cui 'new String (String)' ha senso, come se si avesse una stringa molto grande e si è interessati solo a mantenere una piccola sottostringa . I metodi 'substring' restituiscono solo una vista in peso della stringa originale, quindi usando' new String (hugeString.substring (a, b)) 'forza una copia e consente al GC di recuperare il contenuto di 'hugeString' quando esce da scopo. Non avrebbero dovuto trasformarlo in un costruttore, anche se ... – gustafc

+0

Interessante caso di ottimizzazione, in effetti, ma non vorrei seguire questo percorso prima di aver fatto alcuni controlli del profiler (anche tu, suppongo). – Riduidel

0

Prima verrà creato un nuovo oggetto String in heap e str lo farà riferimento. Inoltre, anche il letterale verrà inserito nel pool di stringhe. Significa che verranno creati 2 oggetti e 1 variabile di riferimento.

La seconda opzione crea letteralmente String in pool e lo farà riferimento a str. Quindi verranno creati solo 1 oggetto e 1 riferimento. Questa opzione utilizzerà sempre l'istanza di String pool anziché crearne una nuova ogni volta che viene eseguita.