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 😀