viernes, 27 de febrero de 2026

■ StringBuilder la alternativa a String

El problema de String

En Java, las variables de tipo String son como una foto, una vez que la tomas no la puedes cambiar, por ejemplo si hacemos esto:

String frase = "Hola";
frase = frase + " mundo"; //o frase += "mundo";


Parece que modificamos "frase", pero en realidad Java hizo esto:
1. Creó el objeto "Hola".
2. Creó el objeto "mundo".
3. Creó un tercer objeto "Hola mundo".

¿Y los primeros dos?, quedan huérfanos en la memoria y eventualmente son eliminados por el garbage collector, es decir, existen pero ya no se usan, por lo tanto "frase" no cambia  solo es sustituida por un nuevo objeto.

Ahora imagina si hacemos esto en un ciclo que se repita muchas veces, lo único que conseguiríamos es saturar la memoria RAM. Entonces ¿cúal es la solución?, aquí es donde entra StringBuilder.


■ StringBuilder

StringBuilder es como escribir a lápiz, podemos anotar, añadir, borrar y volver a anotar, todo sobre el mismo medio, en este caso la variable si cambia y no se destruye cada vez.

¿Cómo funciona?, mantiene un espacio en memoria que puede cambiar, ya sea crecer o reducirse según se necesite, pero ¿cómo se logra esto?, usando los métodos propios de esta clase, estos son los siguientes.

Primero creamos el objeto, a diferencia de la variable String que se crea así:
String texto = "";

El objeto StringBuilder debe crearse como tal, es decir:
StringBuilder sb = new StringBuilder();

Donde "sb" es el nombre que queramos darle.

Una vez creado ya podemos trabajar con él y esto se hace de la siguiente forma:

■ Métodos

append(texto): Inserta un texto al final.

Este método nos sirve para inicializar nuestro objeto o bien para anexarle más texto al final del mismo.

Inicializar:
sb.append("Haz el bien");
System.out.println(sb); // Imprimirá "Haz el bien"


Insertar texto al final:
sb.append(" sin mirar a quién");
System.out.println(sb); // Imprimirá "Haz el bien sin mirar a quién"


Nótese que al anexar la segunda parte la iniciamos con un espacio en blanco, esto para que el texto no quede pegado, de lo contrario diría:
"Haz el biensin mirar a quién"

insert(pos, texto): Inserta texto en determinada posición.
Si queremos insertar al inicio, indicamos en la posición 0:
sb.insert(0, "Hey tú! ");
System.out.println(sb); // Imprime "Hey tú! Haz el bien sin mirar a quién
"

Si queremos insertar algo a media frase, calculamos la posición y la indicamos:
sb.insert(19, ","); // Insertamos una coma
System.out.println(sb); // Imprime: "Hey tú! Haz el bien, sin mirar a quién"

delete(inicio, fin): Elimina un rango del texto.
Recibe dos parámetros, el primero es la posición de la cadena donde inicia el texto a eliminar y el segundo es la posición donde termina, por ejemplo si queremos eliminar la primera parte de la frase:
sb.delete(0, 8);
System.out.println(sb); // Imprime: "Haz el bien, sin mirar a quién"

deleteCharAt(pos): Elimina el caracter de eterminada posición.
Indicamos la posición y elimina el caracter que ahí se encuentre:
sb.deleteCharAt(29);
System.out.println(sb); // Imprime: "Haz el bien, sin mirar a quié"


Es decir, se eliminó el último caracter, otra forma de hacerlo para no tener que contar cuántos caracteres son y saber cuál es el último, es pasándole length como posición menos 1, ya que devuelve la longitud de la cadena pero dado que los índices inician en 0 hay que restar 1:
sb.deleteCharAt(sb.length() - 1);
System.out.println(sb);
 // Imprime: "Haz el bien, sin mirar a quié"

replace(inicio, fin, texto): Remplaza un rango de texto con el proporcionado.

El primer parametro es la posición a partir de la cual queremos insertar el texto, el segundo parámetro es la longitud a partir de la posición inicial que elegimos que sustituirá el nuevo texto de la frase original.

Por ejemplo si queremos sustituir, de la frase anterior "quié" por "quiénes", lo haríamos así:
sb.replace(25, 29, "quiénes");
System.out.println(sb); // Imprime: "Haz el bien, sin mirar a quiénes"


Donde:
25 es la posición donde inicia la palabra "quié".
29 es la posición final de la frase.
Con esto decimos que se va sustituir el texto desde la posición 25 hasta la 29.

Por lo que si quisiéramos insertar un texto sin alterar la frase, le pasaríamos la misma posición inicial como final:
sb.replace(11, 11, " hoy");
System.out.println(sb); // Imprime "Haz el bien hoy, sin mirar a quiénes"
Al decirle que la posición inicial es la misma que la final, el texto nuevo se inserta ahí mismo y empuja al resto, por lo que la frase restante no se ve alterada.

reverse(): Invierte el texto.

Esta es muy simple, solo invierte los caracteres del texto, el primero será el último, el segundo el penúltimo, el tercero el antepenúltimo y así sucesivamente:
sb.reverse();
System.out.println(sb); // Imprime  "senéiuq a rarim nis ,yoh neib le zaH"


Este cambio no es solo visual sino permanente, por lo que si queremos devolver a la frase a su estado original haríamos nuevamente lo mismo:
sb.reverse();
System.out.println(sb); // Imprime "Haz el bien hoy, sin mirar a quiénes"

substring(inicio, fin): Devuelve el texto del rango indicado.

A diferencia de los métodos anteriores, este no modifica la frase, solo regresa parte de ella, por lo que si hacemos esto:
System.out.println(sb.substring(7, 11)); // Imprime "bien"
System.out.println(sb); // Imprime "Haz el bien hoy, sin mirar a quiénes"

La frase original sigue intacta.

charAt(pos): Obtiene el caracter de la posición indicada.

Igual que el caso anterior (substring), este método no cambia la frase, solo obtiene el caracter de la posición que le indiquemos:
System.out.println(sb.charAt(7)); // Imprime "b"
System.out.println(sb); // Imprime "Haz el bien hoy, sin mirar a quiénes"

La frase original sigue intacta.

length(): Devuelve la longitud del texto.
Simplemente devuelve un entero equivalente a la longitud de la cadena de texto que almacena el objeto:
System.out.println(sb); // Imprime 36

setLength(tamaño): Corta o expande el tamaño del texto.
Acorta el texto hasta el tamaño indicado, es decir, si le pasamos un 11, entonces esta será la nueva longitud del texto y se eliminará el resto:
sb.setLength(11);
System.out.println(sb); // Imprime: "Haz el bien"

toString(): Convierte el objeto a tipo String.
String texto = sb.toString(); // Asignar el objeto a una variable String
System.out.println(sb); // Imprime "Haz el bien"
System.out.println(texto); // Imprime "Haz el bien"

capacity(): Devuelve el espacio reservado.
System.out.println(sb.capacity()); // Imprime (en mi caso) 70


Sabiendo esto y dependiendo de lo que necesites hacer, ahora podrás elegir entre String o StringBuilder para trabajar con cadenas de texto, ninguno es mejor que el otro, simplemente se comportan diferente y uno se adapta mejor que el otro en diferentes escenarios.

No hay comentarios:

Publicar un comentario