sexta-feira, 10 de maio de 2019

Concatenando String de forma eficiênte em java

Há momentos que é necessário concatenar ("juntar") uma grande quantidade de Strings em java isso pode ser feito dentre as maneiras simples as duas listadas abaixo:


Pela junção com o operador mais +

...
String x = stringY+stringZ;
...


Exemplo:

     public static void main(String args[]) {
      
        String texto = "Teste 01";
      
        for(int i=0;i<10000 br="" i="">        {
            texto=texto+" Teste "+i;
        }
    }

Pelo método concat da própria classe String


String x = stringY.concat(stringZ);

 Exemplo:

     public static void main(String args[]) {
      
        String texto = "Teste 01";
      
        for(int i=0;i<10000 br="" i="">        {
            texto=texto.concat(" Teste "+i);
        }
    }


Ambas maneiras são validas, porém quando é necessário juntar uma grande quantidade de Strings essas maneiras se tornam defasadas. Para tiramos melhor aproveito uma ótima saída é utilizar a classe StringBuilder.

Sintaxe:

StringBuilder nome = new StringBuilder();

nome.append(string);

Onde:
nome.append(String); - Método para concatenação da string.


Exemplo:

     public static void main(String args[]) {
      
        StringBuilder texto=new StringBuilder();

      
        for(int i=0;i<10000 br="" i="">        {
            texto.append("Teste "+i);

        }
    }




Comparativo

Abaixo é possível ver uma classe que faz a comparação entre os tipos de concatenação acima.
 

 public class Teste {

    public static void main(String args[]) {

      
        String texto = "Teste 01";
        long inicio = System.nanoTime();
        long diferenca;
        //**********************************************
        for(int i=0;i<10000 br="" i="">        {
            texto = texto+"Teste "+i;
        }
      
        diferenca = System.nanoTime()-inicio;
        System.out.printf("\n\nCom soma +");
        System.out.printf("\nTempo: %d ns",(diferenca));
        System.out.printf("\nTamano: %d ns",texto.length());

        inicio = System.nanoTime();
        texto="";

        //**********************************************
        for(int i=0;i<10000 br="" i="">        {
            texto = texto.concat("Teste "+i);
        }
      
        diferenca = System.nanoTime()-inicio;
        System.out.printf("\n\nCom concat");
        System.out.printf("\nTempo: %d ns",(diferenca));
        System.out.printf("\nTamano: %d ns",texto.length());
      
        //**********************************************
        StringBuilder texto2=new StringBuilder();
        inicio = System.nanoTime();

        for(int i=0;i<10000 br="" i="">        {
            texto2.append("Teste "+i);
        }
      
        diferenca = System.nanoTime()-inicio;
        System.out.printf("\n\nCom StringBuilder");
        System.out.printf("\nTempo: %d ns",(diferenca));
        System.out.printf("\nTamano: %d ns",texto2.toString().length());

    }

}



Saída:

Com soma +
Tempo: 293225120 ns
Tamano: 98898 ns

Com concat
Tempo: 23470066971 ns
Tamano: 98890 ns

Com StringBuilder
Tempo: 4156625 ns
Tamano: 98890 ns



Como foi possível ver o método com StringBuilder é muito mais rápido do que as outras maneiras.

Nenhum comentário:

Postar um comentário