"¡Saludos, Amigo!"

"¡Hola, Rishi!"

"Ahora sabes lo suficiente sobre cadenas para aprender algo interesante. Más específicamente, una nueva clase similar, pero no exactamente igual, a la clase String".

"Suena intrigante, aunque no me queda del todo claro cómo las cadenas ordinarias se quedan cortas y por qué se necesitan otras clases similares a cadenas".

"Comencemos con el hecho de que las cadenas son objetos inmutables en Java".

"¿Cómo es eso? Lo olvidé... O nunca supe, para empezar..."

"Déjame recordarte que los objetos inmutables son aquellos cuyos estados no se pueden cambiar después de su creación".

"Ahhh... ¿Por qué las cadenas son inmutables en Java?"

"Esto se hizo para optimizar la clase String y permitir que se use en todas partes. Por ejemplo, solo se recomiendan tipos inmutables para usar como claves en la colección HashMap .

"Sin embargo, a menudo surgen situaciones en las que a los programadores les resulta más conveniente que la clase String sea mutable. Quieren una clase que no cree una nueva subcadena cada vez que se llama a uno de sus métodos".

"¿Pero para qué sirve?"

"Bueno, supongamos que tenemos una cadena muy grande y necesitamos agregarle algo al final con frecuencia. En este caso, incluso una colección de caracteres ( ) ArrayList<Character>puede ser más eficiente que recrear y concatenar objetos String constantemente".

"¿Y es por eso que necesitamos cadenas que no sean exactamente de la clase String?"

"Exactamente. El lenguaje Java ha agregado un tipo similar a una cadena que se puede cambiar. Se llama StringBuilder".

Creando un objeto

"Para crear un StringBuilderobjeto basado en una cadena existente, debe ejecutar una declaración como:

StringBuilder name = new StringBuilder(string);

"Para crear una cadena mutable vacía, debe usar una declaración como esta:

StringBuilder name = new StringBuilder();

Lista de métodos

"La StringBuilderclase tiene dos docenas de métodos útiles. Estos son los más importantes:

Método Descripción
StringBuilder append(obj)
Convierte el objeto pasado en una cadena y lo agrega a la cadena actual
StringBuilder insert(int index, obj)
Convierte el objeto pasado en una cadena y lo inserta en el medio de la cadena actual
StringBuilder replace(int start, int end, String str)
Reemplaza la parte de la cadena especificada por el intervalo de inicio... fin con la cadena pasada
StringBuilder deleteCharAt(int index)
Elimina el carácter con el índice especificado de la cadena
StringBuilder delete(int start, int end)
Elimina caracteres dentro del intervalo especificado de la cadena
int indexOf(String str, int index)
Busca una subcadena en la cadena actual
int lastIndexOf(String str, int index)
Busca una subcadena en la cadena actual, comenzando desde el final
char charAt(int index)
Devuelve el carácter de la cadena en el índice pasado
String substring(int start, int end)
Devuelve la subcadena definida por el intervalo especificado
StringBuilder reverse()
Invierte la cadena actual.
void setCharAt(int index, char)
Cambia el carácter en el índice especificado al carácter pasado
int length()
Devuelve la longitud de la cadena en caracteres

"Y ahora les describiré brevemente cada uno de estos métodos.

Agregar a una cadena

"Para agregar algo a una cadena mutable ( StringBuilder), use el append()método. Ejemplo:

Código Descripción
StringBuilder builder = new StringBuilder("Hi");
builder.append("Bye");
builder.append(123);
Hi
HiBye
HiBye123

Conversión a una cadena estándar

"Para convertir un StringBuilderobjeto en un objeto String, solo necesita llamar a su toString()método. Ejemplo

Código Producción
StringBuilder builder = new StringBuilder("Hi");
builder.append(123);
String result = builder.toString();
System.out.println(result);
Hi123

¿Cómo elimino un personaje?

"Para eliminar un carácter en una cadena mutable, debe usar el deleteCharAt()método. Ejemplo:

Código Producción
StringBuilder builder = new StringBuilder("Hello");
builder.deleteCharAt(2);
String result = builder.toString();
System.out.println(result);
Helo

¿Cómo reemplazo parte de una cadena con otra cadena?

"Para esto existe el replace(int begin, int end, String str)método. Ejemplo:

Código Producción
StringBuilder builder = new StringBuilder("Mellow");
builder.replace(2, 5, "Hello!");
String result = builder.toString();
System.out.println(result);
MeHello!w

"Suena conveniente. Gracias, Rishi".

"Ni lo menciones. ¿Qué te parece esto? ¿Puedes voltear una cuerda hacia atrás? ¿Cómo lo harías?"

"Bueno... Yo crearía un StringBuilder, le pondría una cadena... Luego crearía una nueva cadena, y en un bucle desde el último carácter hasta el primero... O tal vez un cambio bit a bit...

"No está mal. Pero podría ser más rápido. Hay un método especial para hacerlo. reverse();Ejemplo:

Código Producción
String str = "Hello";
StringBuilder builder = new StringBuilder(str);
builder.reverse();
String result = builder.toString();
System.out.println(result);
olleH

"Además de la StringBuilderclase, Java tiene otra clase similar a una cadena llamada StringBuffer. Es un análogo de la StringBuilderclase, pero sus métodos están marcados con el synchronizedmodificador".

"¿Qué significa eso?"

"Significa que StringBufferse puede acceder al objeto simultáneamente desde múltiples hilos".

"Todavía no estoy muy familiarizado con los subprocesos. Pero 'se puede acceder desde múltiples subprocesos' es claramente mejor que 'no se puede acceder desde múltiples subprocesos'... ¿Por qué no usarlo siempre entonces? StringBuffer"

"Porque es mucho más lento que StringBuilder. Es posible que necesite una clase de este tipo cuando comience a explorar activamente los subprocesos múltiples en la búsqueda de subprocesos múltiples de Java .

"Escribiré eso en mi memoria para no olvidar. Marcado 'para el futuro'.