Por: Eder Paraiso C. Flor e Pedro Henrique Araújo
Um bom programa, além de resolver o problema proposto, o resolve (ou tenta) da forma mais eficiente possível. Comecemos com uma proposta bem genérica: fazer uma aplicação onde a manipulação de strings é muito frequente. Vamos trabalhar com strings. Muitas strings. Consideremos que há duas opções: construir o aplicativo em C ou em Java.
Além da manipulação de ponteiros, a falta do "tipo" String afasta muita gente da programação em linguagens procedimentais como C e as aproxima das linguagens orientadas a objeto, por exemplo. Façamos então em Java. Ok, a geração de um código intermediário degrada o desempenho frente à linguagens como C, mas não é desse desempenho que será tratado.
A manipulação de cadeias de caracteres em Java é extremamente simples. Há várias classes para isso. A mais usada e conhecida é a classe String, do pacote java.lang. Precisou de uma string? É fácil, crie e use!
String x = "hello";
Vai precisar unir com outra string? É mais fácil ainda!
String a = x + " world";
Pronto, em duas linhas extremamente simples você uniu duas strings. Pense o trabalho que seria fazer isso manipulando arrays de char, controlar o tamanho e alocação de memória para a string resultante... O objetivo das classes de manipulação de strings é exatamente esse: encapsular essas operações corriqueiras para os desenvolvedores. Mas às vezes esse encapsulamento pode nos atrapalhar.
Muitos devem pensar: "por que (ou para que) existe mais de uma classe que manipula strings?". Em Java temos as classes String, StringBuffer e StringBuilder. Cada uma delas tem suas peculiaridades no modo como foram implementadas e podem trazer alguns resultados significativos dependendo do objetivo da sua aplicação.
Retomando a proposta no início da matéria, e se as operações com strings mais frequentes fossem concatenações? Qual seria o impacto de performance para cada uma dessas classes de string? Vamos continuar utilizando o simples operador "+"? Vejamos.