String vs StringBuffer: Cuál es más eficiente?

Les voy a explicar cual es la diferencia entre las clases String y StringBuffer en JAVA y como el uso de la clase String no es la más eficiente, de hecho es mejor descartar el uso de ésta.

Una de las diferencias más grande entre String y StringBuffer es la asignación, debido a que no es la forma más eficiente en uso de memoria y rendimiento al momento de usarse; cada vez que realizamos una concatenación o una nueva asignación a una variable esto implica crear una nueva instancia de la nueva cadena y descartar la anterior, si lo vemos, cada ves que realicemos una asignación se creará una instancia nueva es decir, se crea un nuevo objeto, debido a que la clase String maneja el concepto de inmutabilidad. 

StringBuffer es una clase que representa un String y cuyo contenido puede cambiar, es decir, es mutable, adicionalmente nos ofrece una cantidad de métodos los cuales son útiles. 

Ahora si vemos un ejemplo claro donde notablemente hay diferencias entre las dos clases.

Se crea la clase StringVsStringBuffer donde se tienen tres métodos: el main, asignacionString y asignacionStringBuffer.

public class StringVsStringBuffer {

    public static void main(String[] args) {
        int nRepeticiones = 10000;
        asignacionString(nRepeticiones);
        asignacionStringBuffer(nRepeticiones);
    }
    
    private static void asignacionString(int n){
        long tiempoInicial = System.currentTimeMillis();
            String cadena = "";
            char caracter;
            for (int i = 0; i < n; i++) {
                caracter = (char)('J'+ i * ('A'+'B'));
                cadena += caracter; 
            }
            long tiempoFinal = System.currentTimeMillis();
            System.out.println("Tiempo de ejecución String: "+(tiempoFinal - tiempoInicial)+" ms");
    }
    
    private static void asignacionStringBuffer(int n){
        long tiempoInicial = System.currentTimeMillis();
            StringBuffer cadena = new StringBuffer();
            char caracter;
            for (int i = 0; i < n; i++) {
                caracter = (char)('J'+ i * ('A'+'B'));
                cadena.append(caracter); 
            }
            long tiempoFinal = System.currentTimeMillis();
            System.out.println("Tiempo de ejecución StringBuffer: "+(tiempoFinal - tiempoInicial)+" ms");
    }
    
}

El método asignacionString no hace más que recibir un parámetro entero el cual va a determinar el fin del ciclo for, así mismo se encarga de realizar la asignación mediante "+", al final lo que hacemos es realizar una resta entre el tiempo final y el tiempo inicial que demoró la ejecución del ciclo. De esta manera el método asignación StringBuffer realiza la misma operación pero utilizando la clase StringBuffer la cual maneja el concepto de mutable.

Ahora ejecutamos la clase 10000 repeticiones y el resultado es el siguiente:

Tiempo de ejecución String: 130 ms
Tiempo de ejecución StringBuffer: 1 ms

Utilizando la clase String se demora 130 ms realizando la asignación 10000 veces y utilizando la clase StringBuffer esas mismas 10000 asignaciones se realizan en 1 ms. Si bien es claro la diferencia entre ambas clases es enorme, así que piénselo bien antes de usar la clase String. Ahora bueno vamos a volver a ejecutar la prueba con 1000000 de asignaciones y estos son los resultados:

Tiempo de ejecución String: 173295 ms
Tiempo de ejecución StringBuffer: 9 ms

Si bien es claro utilizando String se demoró aproximadamente 2.88 minutos realizando el mismo proceso de la clase StringBuffer, la cual solo tardo 9 ms.

Cabe mencionar ya para terminar que las pruebas realizadas las realicé con mi maquina cuyas cracteristicas son las siguientes:
Memoria RAM: 16 gb.
Procesador: Intel Core i7-4770 CPU@3.40 ghz

Muy pronto estaré realizando más publicaciones sobre JAVA, ANDROID, entre otros.

Entradas más populares de este blog

Crear un dominio en servidor Glassfish. create-domain. start-domain.

Descargar archivo con JSF, Primefaces, Hibernate.

Internet gratis para android. 100 mb diarios. DROIDVPN, TUN.KO