2011-10-25 11 views
11

¿Cuál es la diferencia entre estas dos líneas?StringBuilder append vs +

stringBuilder.append("Text " + counter + " more text"); 
stringBuilder.append("Text ").append(counter).append(" more text"); 

Suponiendo que un int contador se incrementación, no la primera línea de crear una cadena "Text 0 more text", "Text 1 more text", etc. cada vez que se llama, mientras que la segunda línea crea sólo una vez que estas dos cadenas: "Text " y " more text"? ¿Es esto correcto?

Respuesta

15

En pocas palabras, sí, excepto que los mismos literales de cadena para "Text " y " more text" se reutilizan todo el tiempo.

La segunda variante es más eficiente, ya que escribe cada uno de los tres componentes directamente en el StringBuilder.

Por el contrario, la primera variante crea otro - sin nombre - StringBuilder, escribe los tres componentes en él, llama a su método toString() y escribe el resultado en el llamado stringBuilder.

En resumen, la primera variante crea un objeto adicional StringBuilder y un objeto adicional String, y copia los datos de cadena dos veces más que la segunda variante.

3

Sí, esto es (en su mayoría) correcto.

De hecho, el segundo no crea nuevas cadenas en absoluto, ya que vuelve a utilizar las mismas cadenas cada vez. Utilizará versiones internas de las cadenas "Texto" y "Más texto".

La primera va a crear una cadena de "Texto 1 texto más" y luego "Texto 2 más texto", utilizando un StringBuilder generado por el compilador.

1

Sí, su interpretación es (casi) correcta.

La primera línea siempre se crea un objeto String como "Text 0 more text", mientras que la segunda lo hace no crear un objeto tan String.

La segunda línea no crear * cualquier * String objetos en absoluto "Text " y " more text" son String literales que No get re-crea cada vez que se ejecuta esa línea. Solo se crean una vez.

El efecto sobre stringBuilder es exactamente la misma en ambos casos, sin embargo.

1

Es casi correcto.

Diría más. Como la cadena java almacena en caché todas las cadenas codificadas, la instancia de las cadenas "Texto" y "Más texto" no se crean en cada iteración.

1

Eso depende de si Java pasantes de las cuerdas o no, pero aún así es ineficiente.

Las cadenas son inmutables, por lo tanto, si utiliza .append ("Cadena" + algo + "Cadena"), fuerza a Java a crear un conjunto de Cadenas nuevas para que pueda terminar con la Cadena final para agregar al buffer. Este es un problema de memoria a menudo perdido, y he visto mejoras significativas en el uso de la memoria en aplicaciones web al eliminar este tipo de código.