Utilizar StringBuffer me vez de Strings

Estava eu fazendo uma rotina para ler um arquivo de texto que no sistema…esse tipo de arquivo tem aproximadamente umas 53.000 linhas…

depois de lido e armazenado o conteúdo do arquivo numa string, tenho que ver linha por linha para modificar alguns valores contidos nesta string…

após isso…devo inserir essa nova string modificada em um novo arquivo…

Só que percebi uma diferença de tempo de processamento exorbitante…mas exorbitante meeeessssmmooo entre usar
Strings e usar StringBuffer… não é diferença de segundos… mas sim de meia hora… pra mais…

por exemplo…
//CÓDIGO LENTO

       String strOriginal = leArquivo("nomedoarquivo.txt")
        StringTokenizer tk = new StringTokenizer(texto,"\n");
        String strNovoArquivo = "";

        while(tk.hasMoreTokens()){
             String token = tk.nextToken();
     
           //faz o processamento dos valores com a string token..
            .
            .
            .
           strNovoArquivo += token + "\n";

       }


     gravaArquivo(strNovoArquivo,"nomeNovoArquivo.txt);

       

//CÓDIGO + RÁPIDO

       String strOriginal = leArquivo("nomedoarquivo.txt")
        StringTokenizer tk = new StringTokenizer(texto,"\n");
        StringBuffer strNovoArquivo = new StringBuffer();

        while(tk.hasMoreTokens()){
             String token = tk.nextToken();
     
           //faz o processamento dos valores com a string token..
            .
            .
            .
           strNovoArquivo.append( token + "\n");

       }


     gravaArquivo(strNovoArquivo.toString(),"nomeNovoArquivo.txt);

       

Agora a pergunta…porque??? porque a enorme diferença de tempo de execução e memória…entre uma string e um StringBuffer… nos meus códigos…vo usar onde puder só stringbuffer…em vez de strings…

Porque a String é imutável, cada vez que faz a iteração é criada uma nova String e atribuida o valor para ela.
Se você utilizar StringBuilder fica mais rapido ainda…

E provavelmente se você utilizar o StringBuilder, vai ficar um pouquinho mais rápido.

Uma parte da tua resposta pode estar aqui - http://www.guj.com.br/java/27728-stringbuffer

Falwz!

Ou, se quiser economizar DEDO, use o chain: strNovoArquivo.append( token).append(’\n’);

hahahaha

Tá engraçado isso, mas interessante!

Eu sou muito chato… pra qualquer coisa com Strings, eu uso o StringUtils da apache… resolve qualquer problema.

Bom, só complementando o que já foi dito acima, Strings são imutáveis, então o que acontece é mais ou menos o seguinte:
quando vc faz isso
String texto = “blablabla”;

Criou uma String texto contendo blablabla, até aí tudo bem.
Quando faz:
texto= “blablabla” + “abcd”;
criou mais duas Strings: a “abcd” e e “blablablaabcd”, só que vc só tem uma referência apontando para “blablablaabcd”, as outras duas Strings “blablabla” e “abcd” ficam vagando na memória, imutáveis esperando alguém referenciá-las e usá-las novamente e isso pode nao acontecer nunca. Um dia quem sabe, isso independe da nossa vontade, mesmo que a gente tente forçar, a gc pode passar por lá e dar uma limpada nisso, mas enquanto isso não acontece, sua memória vai pro espaço. Por isso, sempre que possível use StringBuffer ou StringBuilder, não me lembro agora qual dois dois é ThreadSafe mas acho que o StringBuilder é ainda mais rápido.

Espero ter ajudado.

Abraços

[quote=Ivan Sotelo Codo]Bom, só complementando o que já foi dito acima, Strings são imutáveis, então o que acontece é mais ou menos o seguinte:
quando vc faz isso
String texto = “blablabla”;

Criou uma String texto contendo blablabla, até aí tudo bem.
Quando faz:
texto= “blablabla” + “abcd”;
criou mais duas Strings: a “abcd” e e “blablablaabcd”, só que vc só tem uma referência apontando para “blablablaabcd”, as outras duas Strings “blablabla” e “abcd” ficam vagando na memória, imutáveis esperando alguém referenciá-las e usá-las novamente e isso pode nao acontecer nunca. Um dia quem sabe, isso independe da nossa vontade, mesmo que a gente tente forçar, a gc pode passar por lá e dar uma limpada nisso, mas enquanto isso não acontece, sua memória vai pro espaço. Por isso, sempre que possível use StringBuffer ou StringBuilder, não me lembro agora qual dois dois é ThreadSafe mas acho que o StringBuilder é ainda mais rápido.

Espero ter ajudado.

Abraços[/quote]

O StringBuffer é ThreadSafe, por isso o motivo do StringBuilder ser mais rápido…
Abraços

E troque esta parte do teu código:

por

strNovoArquivo.append( token); strNovoArquivo.append('\n');

Note que agora o \n está entre aspas simples, ou seja, ele passou a ser char.

Ia escrever assim, mas pra quem está aprendendo, linha a linha é um pouco mais legível :wink: mas eu mesmo prefiro essa forma de implementar.