Estou realizando a correção de vários apontamentos feitos pelo Sonar no projeto da empresa onde eu trabalho.
Um desses apontamentos foi a substituição de concatenação de Strings para StringBuilder. Lembro de ter visto isso no curso da Academia Java, mas não lembrava da importância dessa alteração. Vejamos o exemplo:
import java.util.Date;
public class Main {
public static void main(String[] args) {
String string = "";
Date dtInicialString = new Date();
for (int i = 0; i < 40000; i++) {
string += +i + ";";
}
Long resultado = (new Date().getTime() - dtInicialString.getTime());
System.out.println("String: " + resultado + " milisegundos");
System.out.println("-------------------------------------------");
StringBuilder stringBuilder = new StringBuilder();
Date dtInicialBuilder = new Date();
for (int i = 0; i < 40000; i++) {
stringBuilder.append(i).append(";");
}
Long resultadoBuilder = (new Date().getTime() - dtInicialBuilder.getTime());
System.out.println("StringBuilder: " + resultadoBuilder + " milisegundos");
System.out.println("-------------------------------------------");
StringBuffer stringBuffer = new StringBuffer();
Date dtInicialBuffer = new Date();
for (int i = 0; i < 40000; i++) {
stringBuffer.append(i).append(";");
}
Long resultadoBuffer = (new Date().getTime() - dtInicialBuffer.getTime());
System.out.println("StringBuffer: " + resultadoBuffer + " milisegundos");
System.out.println("-------------------------------------------");
}
}
Saída no console:
String: 12913 milisegundos ------------------------------------------- StringBuilder: 6 milisegundos ------------------------------------------- StringBuffer: 22 milisegundos -------------------------------------------
A diferença é gritante no desempenho. Isso ocorre pois ao concatenar strings com o + é criado um novo objeto a cada iteração, ficando então objetos perdidos na memória.
Já a diferença entre StringBuffer e StringBuilder é que o primeiro os métodos são sincronizados, tornando então o processo mais lento.
Por hoje era isso, até mais 😀