2012-08-13 16 views
26

Duplicar posible:
StringBuilder vs String concatenation in toString() in Java¿Por qué usar StringBuilder explícitamente si el compilador convierte la concatenación de cadenas en un StringBuilder automáticamente?

Me pregunto, ya que el compilador internamente utiliza un StringBuilder para anexar 2 Cuerdas cuando se realiza la concatenación de cadenas, entonces ¿cuál es el punto y el uso de la razón por qué me molesto StringBuilder si la concatenación de cadenas ya hizo el trabajo por usted? ¿Hay alguna otra razón específica?

Respuesta

53

Como mencionas, no deberías usar StringBuilder en lugar de una expresión de concatenación de cadena simple como a + " = " + b. Este último es más rápido de escribir, más fácil de leer, y el compilador usará un StringBuilder internamente de todos modos, por lo que no hay ventaja de rendimiento al reescribirlo.

Sin embargo, StringBuilder es útil si está concatenando una gran cantidad de cadenas en un bucle. El siguiente código es ineficiente. Requiere O (n) tiempo de ejecución y crea muchas cadenas temporales.

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

Tal vez puedas probar:

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

El compilador optimiza sólo simples a + b + c expresiones. No puede optimizar el código anterior automáticamente.

+3

@ JohanSjöberg sí, de hecho lo hace. Hacer 'result + = bar (foo [i])' producirá código como (suponiendo javac) 'result = new StringBuilder(). Append (result) .append (foo [i]). ToString()'. Tenga en cuenta que esto es mucho más trabajo que usar un 'StringBuilder'. – oldrinb

+0

@ JohanSjöberg El punto es que __ las muestras no son equivalentes__ – oldrinb

+0

Todavía no estoy tan claro ¿por qué? ¿Es porque requiere copiar sobre la cadena anterior (anterior) antes de hacer la concatenación para la primera muestra? – peter

3

¿Dónde está suponiendo que la concatinación de cuerdas utiliza stringbuilder internamente? Tal vez un concat simple se optimiza, pero esto definitivamente no:

String s = ""; 

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

Entonces, ¿qué será esto internamente? – peter

+0

@ user1389813 's = new StringBuilder.append (" "). Append (i) .append (j) .toString();' suponiendo que el compilador es javac. – oldrinb

+0

así que cada vez creará un nuevo StringBuilder para realizar la concatenación, por eso es malo y lento, ¿correcto? – peter

Cuestiones relacionadas