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…
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.
[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