miércoles, 3 de octubre de 2007

String v/s StringBuilder

Un objeto de tipo String permite Almacenar una cadena de texto o cadena de caracteres. De la misma manera un objeto de tipo StringBuilder almacena una cadena de caracteres o texto.

Existe una gran diferencia entre ambas implementaciones: String es inmutable, mientras que StringBuilder permite mutaciones.

¿Qué significa realmente esto?
Bueno tal como lo dice el concepto, String es inmutable, por ende no puede cambiar. Esto significa que no es posible agregar contenido a un String ya definido.
¿Cómo dice?, ¿Entonces qué diablos hace el siguiente código?

string miString = "Hola";
miString = miString + " Mundo";

Bueno, la primera línea crea un objeto de tipo String inicializándolo en un valor de texto "Hola", luego, en la segunda línea, lo que efectivamente se realiza es:

  • Crear un nuevo objeto String, que tendrá como valor el valor del objeto miString concatenado con el valor " Mundo".

  • Asignar a miString este nuevo objeto creado.


En resumen, un String no es mutable y cada vez que se "modifica" su valor, realmente lo que se hace es crear un nuevo objeto String y asignarlo a la variable "modificada".

Esta acción puede traer serios problemas de eficiencia y seguridad, ya que eventualmente podría acarrear problemas de desborde de memoria (sobretodo en witios web) lo que implica una serie de riesgos en cuanto a seguridad.

En la otra esquina tenemos la clase StringBuilder, la que mencione es mutable y por ende, puede variar su contenido. Un objeto de tipo StringBuilder permite agregar, eliminar, sustituir e insertar datos sin crear una nueva instancia de la clase, lo que significa un ahorro e recursos comparado con un objeto String.

La manera de trabajo de StringBuilder es la siguiente:

  • maneja un buffer que permite agregar datos directamente si el dato agregado es menor al espacio libre en el buffer.

  • Si el dato es mayor que el buffer, entonces se solicita un nuevo buffer con tamaño mayor, se copian los datos actuales, y finalmente se agregan los nuevos datos.


Al comparar ambos tipos de datos, es posible identificar las siguientes características.

  • Si la cantidad y tamaño de datos a agregar a un string es constante y conocida, entonces es más eficiente utilizar un objeto de tipo String.

  • Si la cantidad y tamaño de datos a agregar a un string es variable y/o desconocida, entonces una intancia de StringBuilder presenta mayores beneficios que una instancia de String.

No hay comentarios: