JavaRush /Blogue Java /Random-PT /String += String ou StringBuilder.append(String)?
SemperAnte
Nível 4
Донецк

String += String ou StringBuilder.append(String)?

Publicado no grupo Random-PT
Neste artigo, gostaria de considerar, analisar, contar e mostrar qual é a diferença entre o método append da classe StringBuildere o operador +=for String. Aqui a questão não será tanto nas áreas de aplicação, mas na otimização do código.
String += String ou StringBuilder.append(String)?  - 1
Sim, uma pessoa que sem dúvida não se aprofundou nesta questão dirá: "Por que devo substituir o operador += criando um novo objeto de uma classe completamente diferente e depois chamar o método também toString()? Que tipo de otimização estamos falando? A escolha é óbvia, do que você está falando? e ele estaria completamente errado. Um dos problemas é que Stringnão é primitivo. String- um objeto como qualquer outro classem Java, e como você sabe, em Java não existe sobrecarga de operador (como em C++, por exemplo), os operadores são definidos apenas para primitivos, e para qualquer classe não podemos substituir nenhum operador. É por isso que os operadores " +" e " += " são uma espécie de "muleta" da biblioteca Java, e uma muleta sempre incorre em perdas. Na verdade, vamos parar de puxar o rabo do gato e passar às medidas. Aqui está um programa simples que mede o tempo que leva para “colar” uma linha com uma variável de loop 100.000 vezes.
public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        String s = "Hello";
        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");
    }
}
No meu computador, 6815ms foram exibidos no console. Ou seja, meu computador levou quase 7 segundos para costurar essa linha. Agora vamos substituí-lo pelo StringBuilder e ainda incluir o método toString()nas medidas.
public class MainClass
{
    private static long time;

    public static void main(String[] args)
    {

        saveTime();
        StringBuilder sb = new StringBuilder("Hello");
        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");
    }
}
Meu PC me disse 10ms. Ou seja, 0,01 segundos. Acho que a diferença na prática é bastante óbvia: grosso modo, funcionou 700 vezes appendmais rápido. Isso se deve ao fato de que muito provavelmente " +" e " +=" podem eles próprios chamar o mesmo apêndice, mas ao mesmo tempo tendo percorrido um longo caminho através das muletas da linguagem para entender que tal operador existe e o que ele deveria fazer (o último parágrafo nada mais é do que um palpite, não sou um desenvolvedor JVM e não sei o que existe e como). Este é um exemplo claro de que um objeto extra nem sempre é caro. Sim, o código terá algumas linhas a mais, mas a economia de tempo em grandes projetos pode ser colossal. Observe que as medições não foram feitas em um PC de escritório com processador pré-histórico, mas agora imagine a diferença que isso fará neste mesmo computador de escritório, que dificilmente consegue puxar o lenço.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION