El problema de String
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.
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"
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"
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:
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é"
System.out.println(sb); // Imprime: "Haz el bien, sin mirar a quié"
replace(inicio, fin, texto): Remplaza un rango de texto con el proporcionado.
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.
System.out.println(sb); // Imprime "Haz el bien hoy, sin mirar a quiénes"
reverse(): Invierte el texto.
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.
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.
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