Skip to content

2 StringBuilder y StringBuffer

Introducción

Como se ha dicho en el apartado anterior, las cadenas son objetos constantes e inmutables, es decir, una vez que son creadas no pueden ser modificadas. Por ejemplo:

String s = "hello";
s += " world";
System.out.println(s); // Hello world

En primer lugar, se ha creado un objeto String y se ha referenciado a él n the first line, a String "Hello" object is created and a reference to it, is stored in the s variable.

En la segunda línea otro objeto "world" es creado y después viene una concatenación de objetos ("Hello" y "world"). La concatenación produce un nuevo objeto cadena "Hello world" cuya referencia será almacenada en la variable s.

Los objetos "Hello" y "world" son objetos obsoletos porque nadie usa su referencia, así que no son usados. La JVM tiene un recolector de basura el cuál limpia esos objetos de la memoria.

Cuando manipulamos cadenas, ya sea concatenando, insertando o remplazando caracteres, muchos objetos son creados y rápidamente descartados. Esta creación de objetos de forma masiva puede provocar un incremento del uso de la memoria.

El recolector de basura de Java limpia la memoria, pero dicha operación tiene un tiempo costoso. Si nosotros creamos y destruimos muchos objetos, la ejecución de nuestro programa puede ser poco eficiente.

StringBuffer y StringBuilder son clases que nos permite crear objetos que almacenan cadenas que pueden ser modificadas sin necesidad de crear nuevos objetos.

Ambas clases, tienen métodos que nos permite manipular cadenas, como append, insert, etc.

StringBuilder y StringBuffer son muy parecidos, pero StringBuffer puede ser usado en programas concurrentes con el uso de múltiples hilos de forma que sea thread safe (seguro para hilos), lo que hace que StringBuilder sea mucho más eficientes para programas no concurrentes.

StringBuilder

StringBuilder es una clase de Java que nos permite manipular cadenas evitando la problemática de la creación de objetos innecesarios. Algunos métodos de esta clase son:

  • StringBuilder append(String s). Añade la cadena pasada por parámetro a la secuencia de caracteres. Este método esta sobrescrito para añadir cualquier tipo primitivo (int, boolean, char, etc.), para añadir Object o un StringBuffer
  • int capacity(). Retorna el número de caracteres actuales que hay almacenados.
  • StringBuilder delete(int start, int end). Elimina la subcadena en la secuencia de caracteres.
  • StringBuilder deleteCharAt(). Elimina el carácter especificado en la secuencia de caracteres.
  • StringBuilder insert(int offset, String str). Inserta la cadena especificada a la secuencia de caracteres en la posición indicada, moviendo, si es necesario, el resto de caracteres. Este método está sobrescrito para los tipos primitivos y el tipo Object.
  • StringBuilder reverse(). Reemplaza la secuencia de caracteres actual por la secuencia de caracteres invertida.
  • String toString(). Devuelve la secuencia de caracteres como String.

Además de estos métodos, también tiene métodos parecidos de la clase String como charAt(), indexOf(), lastIndexOf(), length(), subString().

import java.util.Scanner;

public class StringBuilderExample {
    public static void main(String[] args) {
        StringBuilder builder = new StringBuilder();
        Scanner scanner = new Scanner(System.in);

        for(int i = 1; i <= 10; i++){
            System.out.print("Introduce una cadena: ");
            builder.append(scanner.nextLine());
        }

        System.out.printf("Capacidad actual: %d\n", builder.capacity());

        builder.insert(5, "String insertada en el carácter 5");
        builder.insert(0, true);

        System.out.printf("Cadena actual: %s\n", builder);

        System.out.printf("Primer carácter: %s\n", builder.charAt(0));
        System.out.printf("Tamaño de la cadena: %d\n", builder.length());
        System.out.printf("La letra 'A' se encuentra en: %d\n", builder.indexOf("A"));

        System.out.printf("Cadena invertida: %s\n", builder.reverse());
    }
}

StringBuffer

La clase StringBuffer funciona de forma muy similar a la clase StringBuilder pero con la diferencia que ésta es thread-safe, segura para trabajar con hilos. Algunos métodos de esta clase son:

  • StringBuffer append(String s). Añade la cadena pasada por parámetro a la secuencia de caracteres. Este método esta sobrescrito para añadir cualquier tipo primitivo (int, boolean, char, etc.), para añadir Object u otro StringBuffer
  • int capacity(). Retorna el número de caracteres actuales que hay almacenados.
  • StringBuffer delete(int start, int end). Elimina la subcadena en la secuencia de caracteres.
  • StringBuffer deleteCharAt(). Elimina el carácter especificado en la secuencia de caracteres.
  • StringBuffer insert(int offset, String str). Inserta la cadena especificada a la secuencia de caracteres en la posición indicada, moviendo, si es necesario, el resto de caracteres. Este método está sobrescrito para los tipos primitivos y el tipo Object.
  • StringBuffer reverse(). Reemplaza la secuencia de caracteres actual por la secuencia de caracteres invertida.
  • String toString(). Devuelve la secuencia de caracteres como String.

Además de estos métodos, también tiene métodos parecidos de la clase String como charAt(), indexOf(), lastIndexOf(), length(), subString().

Ejercicios

Ejercicio 1

Crea un método que reciba una cadena de sólo dígitos, y devolver la misma cadena pero con separadores de miles, si es posible. Por ejemplo, si recibe la cadena 3456 devolverá 3.456, si recibe 123456789, devolverá 123.456.789 y si recibe 123 devolverá 123. Hacer uso de la clase StringBuilder.

Ejercicio 2

Realiza el ejercicio anterior, pero ahora haciendo uso de la clase StringBuffer.