String, StringBuilder y StringBuffer en Java

Los objetos String son inmutables, esto puede suponer una gran diferencia con respecto a StringBuilder y StringBuffer que si que son mutables. Cuando trabajas con Strings nunca se muta el objeto original, se crea un objeto nuevo y cambia la referencia de memoria de la variable a ese nuevo objeto. El objeto original queda sin referencia a ninguna variable y el recolector de basura de java se encarga de destruirlo. Esto cuando se trata de trabajar con muchos nuevos objetos puede provocar un retardo en la ejecución del proceso.

Con StringBuilder o StringBuffer esto no sucede porque son objetos mutables, es decir, no se crea un nuevo objeto cada vez que manipulamos la cadena guardada en StringBuilder o StringBuffer, por tanto tampoco cambia la referencia al espacio de memoria asignado a la variable de la cadena.

Ejemplo:

String saludo = "Hola";
saludo = saludo + " Luis";

Con String saludo = “Hola”; estamos creando la variable saludo que crea un objeto y apunta a una posición de memoria.

Con saludo = saludo + “ Luis”; estamos concatenamos el nombre de Luis a lo que contiene la variable saludo, en este caso Hola, pero esto no esta modificando el valor de la variable saludo sino está creando un nuevo objeto que va a guardar dicha concatenación y va a apuntar a la posición de memoria de la variable saludo. Ahora el objeto anterior que guarda la cadena Hola ha quedado sin referencia a ninguna posición de memoria, no lo vamos a usar nunca más pero hasta que el recolector de basura de java lo elimine, va a seguir consumiendo recursos innecesarios.

Por el contrario con StringBuilder o StringBuffer esto no pasa, solo se modifica el objeto original y siempre apunta a la misma posición de memoria.

Ejemplo:

StringBuilder saludo = new StringBuilder("Hola");
saludo.append(" Luis");

StringBuilder y StringBuffer son casi iguales. StringBuffer puede ser usado en programas concurrentes, lo que se conoce como “thread safe”. Esto hace que StringBuilder sea más eficiente en programas no concurrentes.

Por tanto, si vamos a trabajar intensamente con cadenas, es mucho mejor utilizar StringBuilder y StringBuffer en lugar de String.