2012-08-13 3 views
26

Eventuali duplicati:
StringBuilder vs String concatenation in toString() in JavaPerché utilizzare StringBuilder in modo esplicito se il compilatore converte automaticamente la concatenazione della stringa in un oggetto StringBuilder?

Mi chiedo, dal momento che il compilatore utilizza internamente uno StringBuilder per aggiungere 2 stringhe durante l'esecuzione concatenazione di stringhe, allora qual è il punto e perché dovrei preoccuparsi utilizzando StringBuilder se la concatenazione di stringhe ha già fatto il lavoro per te? Ci sono altri motivi specifici?

risposta

53

Come si menziona, non utilizzare StringBuilder anziché una semplice espressione di concatenazione di stringhe come a + " = " + b. Quest'ultimo è più veloce da digitare, più facile da leggere, e il compilatore userà uno StringBuilder internamente in ogni caso, quindi non c'è alcun vantaggio in termini di prestazioni riscrivendolo.

Tuttavia, StringBuilder è utile se si concatena un numero elevato di stringhe in un ciclo. Il seguente codice è inefficiente. Richiede O (n) ora di esecuzione e crea molte stringhe temporanee.

String result = ""; 
for (int i = 0; i < foo.length; ++i) 
{ 
    result += bar(foo[i]); // Bad 
} 

Prova a modificare:

StringBuilder sb = new StringBuilder(); 
for (int i = 0; i < foo.length; ++i) 
{ 
    sb.append(bar(foo[i])); 
} 
String result = sb.toString(); 

Il compilatore ottimizza solo semplici a + b + c espressioni. Non può ottimizzare automaticamente il codice sopra.

+3

@ JohanSjöberg sì, in effetti lo fa. Facendo 'result + = bar (foo [i])' produrrà un codice simile (assumendo javac) 'result = new StringBuilder(). Append (result) .append (foo [i]). ToString()'. Si noti che questo è molto più lavoro che usare uno 'StringBuilder'. – oldrinb

+0

@ JohanSjöberg il punto è che __il campione non è equivalente__ – oldrinb

+0

Non sono ancora chiaro perché ?? È perché richiede di copiare oltre la vecchia stringa (precedente) prima che faccia la concatenazione per il primo campione? – peter

3

Dove si assume che la concatinazione di stringhe usi internamente il costruttore di stringhe? Forse un semplice concat viene ottimizzato via, ma questo sicuramente non lo sarà:

String s = ""; 

for (int i = 0; i < 1000; i++){ 
    for (int j = 0; j < 1000; j++){ 
    s+= "" + i + j 
} 
} 
+1

Quindi che cosa sarà internamente? – peter

+0

@ user1389813 's = new StringBuilder.append (" "). Append (i) .append (j) .toString();' presumendo che il compilatore sia javac. – oldrinb

+0

così ogni volta che creerà un nuovo StringBuilder per eseguire la concatenazione, ecco perché è brutto e lento, corretto? – peter