O uso de Strings é comum a todas as aplicações, afinal, eu nunca vi uma aplicação que, pelo menos, não escreva nada na tela. E sabemos que usamos strings para diversas coisas, como: propriedades de objetos, display, ler dados de arquivos e querys entre outros.

O Java nos dá três classes para trabalharmos com Strings, são elas: String, StringBuilder e StringBuffer, e por isso devemos ter cuidado na hora de usa-las pois com uso bem feito podemos obter melhor desempenho em nossa aplicações.

Dito isto, podemos partir para nosso objetivo que será demonstrar através de exemplos simples uma maneira eficaz de aumentar o desempenho de nossas aplicações através do uso correto de Strings. De antemão quero ressaltar que esse artigo não explorará todos os aspectos das classes acima, mas apenas aqueles que nos levarão a conclusão do mesmo.

Para um iniciante é comum ver que ele sai usando a classe String a torto e a direito, pois talvez não conheça a API do Java suficientemente para saber ao certo qual melhor classe usar. Mas isso numa aplicação real a utilização de muitas Strings tem um grande custo. Vejamos o exemplo no qual temos várias concatenações utilizando a classe String e símbolo de “+” para concatenar.

Listagem 1: Exemplo de uso de String


public class TestString {	
	public static void main(String[] args){
		String msg = "";		
		for(int x = 0;x <= 10000; x++){			
			msg +=  "O valor de x é = " + x + "\n";		
		}
		System.out.println(msg);		
	}
}

Ao executar essa classe no meu computador obtive o resultado após 7200 milissegundos, isso devido à forma como a classe String trabalha, criando sempre um novo objeto do tipo StringBuilder,o que deixa muitos objetos soltos no HEAP que devem ser limpos pelo Garbage Collector. E por fim chama o método append() para concatenar e retorna o toString(), ou seja, são no minimo 4 operações.

Em casos como esse, em que vamos fazer um grande loop e com muitas Strings envolvidas, para obtermos um melhor desempenho devemos fazer uso das classes StringBuilder e StringBuffer, que são praticamente iguais e tem os mesmos metodos, basicamente a diferença está na maneira como elas tratam as strings, StringBuffer é thread safe enquanto StringBuilder não, então esta string tende a ser um pouco mais rápida.

StringBuilder veio para substituir StringBuffer nos casos que não precisarmos da segurança multi-thread que é a maioria dos casos. Então sempre em casos como o da Listagem 1 opte por usar StringBuilder. Ela tem basicamente dois métodos principais append() e insert(), StringBuffer também tem esses métodos, no entanto eles foram sobrecarregados para suportar diversos tipos de formatos.

Vejamos como ficaria o mesmo exemplo agora com StringBuilder.

Listagem 2: Exemplo do uso de StringBuilder


class TestStringBuilder {	
	public static void main(String[] args){
		StringBuilder msg = new StringBuilder();			
		for(int x = 0;x <= 10000; x++){		
			msg.append("O valor de x é = ");
			msg.append(x);
			msg.append("\n");			
		}
		System.out.println(msg);
	}

}

Dessa vez o resultado foi exibido após 21 milisegundos em sua melhor marca agora que fizemos uso direto de StringBuilder.

Agora que você tem um grande poder nas mãos e todos sabem que “Com grandes poderes vem grandes responsabilidades”, e você pode querer sair substituindo todas as chamadas à Strings para StringBuilder, isso é ruim em alguns casos pois pode provocar a legibilidade do código, então análise o caso e quando não for necessário StringBuilder mantenha a melhor legibilidade possível.

Então é isso pessoal, espero que tenham gostado, comentem e até a próxima.