2010-11-16 16 views
13

Sta usando un costruttore String() rispetto a string letteral vantaggioso in qualsiasi scenario? L'utilizzo di stringhe letterali abilita il riutilizzo di oggetti esistenti, quindi perché abbiamo bisogno del costruttore pubblico? Esiste un uso del mondo reale? Ad es., Entrambi i letterali puntano allo stesso oggetto.Perché il costruttore della stringa String() non è privato?

String name1 = "name";//new String("name") creates a new object. 
String name2 = "name"; 

risposta

18

Un esempio in cui il costruttore ha uno scopo utile: le stringhe create da String.substring() condividono il sottostante char[] del String che stanno creati da. Pertanto, se si dispone di un valore di String di lunghezza 10.000.000 (occupa fino a 20 MB di memoria) e si prelevano i primi 5 caratteri come sottostringa, quindi eliminare l'originale String, la sottostringa continuerà a mantenere l'oggetto 20MB idoneo per la garbage collection. L'utilizzo del costruttore di stringhe su di esso eviterà questo, poiché esegue una copia solo della parte dell'array char sottostante effettivamente utilizzata dall'istanza String.

Naturalmente, se si crea e utilizza un sacco di stringhe dello stesso String, soprattutto se si sovrappongono, allora si sarebbe molto desidera loro di condividere il sottostante char[], e utilizzando il costruttore sarebbe controproducente.

+0

Questa è stata una dura lezione appresa per me circa 5 anni fa. –

+0

È stata una bella lezione ma non risponde all'intestazione: "perché non è un costruttore di stringhe * privato *?" String.subsring() può implementare tutte le sue ottimizzazioni usando il costruttore privato come metodo della classe String. La domanda è: perché questo costruttore è pubblico ?! – AlexR

+1

@AlexR: leggere di nuovo la risposta, in particolare l'ultima frase del primo paragrafo. –

0

Perché talvolta è possibile creare una copia e non solo un nuovo riferimento alla stessa stringa.

+0

Puoi dare un esempio di tale scenario? – cdhowie

+3

Ho visto questa mattina una domanda su una WeakHashMap, che è una HashMap che rimuove automaticamente un elemento quando la sua chiave è spazzata via. Si scopre che non si dovrebbero usare stringhe letterali come chiavi con quelle perché non verrebbero mai recuperate. –

3

Poiché la stringa è immutabile, le operazioni come la sottostringa mantengono la stringa originale che potrebbe essere lunga. L'utilizzo del costruttore per creare una nuova stringa dalla sottostringa creerà una nuova stringa e consentirà di eliminare la vecchia stringa (in GC). In questo modo si potrebbe liberare memoria necessaria.
Esempio:

String longS = "very long"; 
String shortS = new String(longS.substring(4)); 
+0

@Erick: No, non necessariamente identico. Vedi la risposta di Michael. –

+0

@Erick: sì, perché il sottostante array di caratteri può essere molto più grande del contenuto di stringa "visibile". –

+0

Michael lo spiega meglio. –

0

Tutte le buone risposte qui, ma penso che valga la pena sottolineare che il Java tratta letterali molto diversi rispetto a quelli costruiti in modo tradizionale.

Questo è a good Q/A su di esso.

Problemi correlati