2008-11-13 44 views
28

Si tiene que usar String.Replace() para reemplazar la prueba 50 veces, básicamente tiene que crear una nueva cadena 50 veces. ¿StringBuilder.Replace() hace esto de manera más eficiente? Por ejemplo, ¿debería usar un StringBuilder si voy a reemplazar una gran cantidad de texto, incluso si no le anexaré ningún dato?¿Es StringBuilder.Replace() más eficiente que String.Replace?

Estoy usando .NET, pero supongo que esto sería lo mismo que Java y posiblemente otros idiomas.

+3

StringBuilder.Replace debería usar menos memoria, pero no será más eficiente que la cadena.Replace http://www.codeproject.com/KB/cs/StringBuilder_vs_String.aspx –

Respuesta

29

Este es exactamente el tipo de cosas que StringBuilder es para - la modificación repetida del mismo objeto de texto - no es solo para la concatenación repetida, aunque parece ser lo que se usa con mayor frecuencia.

5

Sí, lo es. String.Replace siempre crea una nueva cadena - StringBuilder.Replace no.

+2

Esto no es del todo cierto, observe el código fuente. StringBuilder.replace() llama a AbstractStringBuilder.replace() que llama a AbstractStringBuilder.expandCapacity() si es necesario. AbstractStringBuilder.expandCapacity() llama a Arrays.copyOf() que crea una nueva matriz de caracteres, y esto es lo mismo que crear una nueva Cadena. –

+4

@Avi: "no" se refiere a "' String.Replace' * always * crea una nueva cadena ", observe el énfasis en" always ". –

8

depende si el tamaño de la sustitución es larger than the string replaced.

El StringBuilder sobre asigna su memoria intermedia, mientras que una cadena única vez tiene cómo cada vez son muchos caracteres en ella.

La propiedad StringBuilder.Capacity es la cantidad de caracteres que contendrá el búfer, mientras que StringBuilder.Length es cuántos caracteres están en uso.

Normalmente, debe establecer StringBuilder.Capacity en un valor mayor que la cadena resultante esperada. De lo contrario, StringBuilder necesitará reasignar su búfer. Cuando el StringBuilder reasigna su memoria intermedia, se duplica en tamaño, lo que significa que después de un par reasigna es probable que sea significativamente más grande que tiene que ser, por la capacidad por defecto comienza a las 16.

Al establecer el valor de la capacidad cuando se start (en el constructor por ejemplo) guarda las reasignaciones del buffer de StringBuilder. Puede usar StringBuilder.MaxCapacity para limitar la capacidad máxima a la que se puede expandir un StringBuilder.

+1

Una cadena creada con un StringBuilder a menudo también contiene más que el número de caracteres "útiles", porque un StringBuilder en realidad solo contiene una cadena que utiliza como su buffer. –

Cuestiones relacionadas