JavaRush /Blog Java /Random-ES /¿Cadena += Cadena o StringBuilder.append(Cadena)?
SemperAnte
Nivel 4
Донецк

¿Cadena += Cadena o StringBuilder.append(Cadena)?

Publicado en el grupo Random-ES
En este artículo me gustaría considerar, analizar, contar y mostrar cuál es la diferencia entre el método append de la clase StringBuildery el operador +=for String. Aquí la cuestión no será tanto de áreas de aplicación como de optimización del código.
¿Cadena += Cadena o StringBuilder.append(Cadena)?  - 1
Sí, una persona que sin duda no ha profundizado en esta pregunta dirá: "¿Por qué debería reemplazar el operador += creando un nuevo objeto de una clase completamente diferente y luego llamar al método también toString()? ¿Qué tipo de optimización tenemos?" "¿De qué estás hablando? La elección es obvia, ¿de qué estás hablando?" y estaría completamente equivocado. Uno de los problemas es que Stringno es primitivo. String- un objeto como cualquier otro classen Java, y como sabes, en Java no existe la sobrecarga de operadores (como en C++, por ejemplo), los operadores se definen solo para primitivos y para cualquier clase no podemos anular ningún operador. Es por eso que los operadores " +" y " += " son una especie de "muleta" de la biblioteca Java, y una muleta siempre genera pérdidas. En realidad, dejemos de tirar de la cola del gato y pasemos a las medidas. Aquí tienes un programa sencillo que mide el tiempo que lleva "pegar" una línea con una variable de bucle 100.000 veces.

public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        String s = "Hola";
        for(int i = 0; i < 100000; ++i)
        {
            s+=i;
        }
        printDiff();

    }
    private static void saveTime()
    {
        time = System.currentTimeMillis();
    }

    private static void printDiff()
    {
        System.out.println((System.currentTimeMillis() - time) + "ms");
    }
}
En mi computadora, se mostraba 6815ms en la consola. Es decir, a mi computadora le tomó casi 7 segundos unir esta línea. Ahora reemplacémoslo con StringBuilder e incluso incluyamos el método toString()en las medidas.

public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        StringBuilder sb = new StringBuilder("Hola");
        for(int i = 0; i < 100000; ++i)
        {
            sb.append(i);
        }
        String s = sb.toString();
        printDiff();

    }
    private static void saveTime()
    {
        time = System.currentTimeMillis();
    }

    private static void printDiff()
    {
        System.out.println((System.currentTimeMillis() - time) + "ms");
    }
}
Mi PC me dijo 10ms. Es decir, 0,01 segundos. Creo que la diferencia en la práctica es bastante obvia: en términos generales, funcionó 700 veces appendmás rápido. Esto se debe al hecho de que lo más probable es que " +" y " +=" puedan llamar al mismo anexo, pero al mismo tiempo han recorrido un largo camino con las muletas del lenguaje para comprender que tal operador existe y qué debería hacer (el último párrafo no es más que una suposición, no soy un desarrollador de JVM y no sé qué hay allí ni cómo). Este es un claro ejemplo de que un objeto extra no siempre sale caro. Sí, el código será un par de líneas más largo, pero el ahorro de tiempo en proyectos grandes puede ser colosal. Tenga en cuenta que las mediciones no se realizaron en una PC de oficina con un procesador prehistórico, pero ahora imagine la diferencia que hará en esta misma computadora de oficina, que apenas puede quitarse la bufanda.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION