segunda-feira, 13 de junho de 2011

Dicas de Programação: Qual é a diferença de String, StringBuilder e StringBuffer em Java?

Essa foi uma pergunta que surgiu aqui na empresa...

E essa vai ser a resposta:

String é uma classe que define um objeto imutável, ou seja, que uma vez criado, o estado do objeto não pode ser mudado (isso significa que os valores que estão na classe nunca mais mudam...):

//Nova string
String str = new String("Ola mundo!");
//Concatena a String
str.concat("Ola pessoal!");
//Exibe o valor
System.out.println(str);

Se você perceber, o método concat devolve uma String com o valores concatenados, portanto, uma nova instância do objeto da classe String (ele não modificou o objeto atual...).

Agora, se fizermos isso com o StringBuffer ou com o StringBuilder:
//Novo objeto
StringBuffer buffer = new StringBuffer("Ola mundo!");
//Concatena a String
buffer.append("Ola pessoal");
//Exibe o valor
System.out.println(buffer);

Ele atualiza o estado do objeto!

Você deve perguntar: Qual é a vantagem disso?
As vantagens de atualizar o mesmo objeto:
- Não cria um novo objeto a cada atualização (economia de memória);
- É mais rápido (performático, como dizem alguns especialistas :P);

Mas então, a classe imutável não deve ser usada?
Deve sim, para coisas que, geralmente, não mudam (tipo: mensagens e constantes), pois classes mutáveis exigem mais da alocação e do gerenciamento de memória (ponteiros).

E qual é a diferença em StringBuilder e StringBuffer?
A primeira cria objetos não sincronizados e a segunda sincronizados. :P

Não entendeu? Essa explicação fica para um próximo post!

Ah... só uma coisa: a partir do Java 5, não é preciso se preocupar com estas coisas, que qualquer instrução dessa:

String b = "a";
int c = 2;
String a = b + "=" + c;

O compilador já otimiza para, mais ou menos, isso:

String b = "a";
int c = 2;
StringBuilder a = new StringBuilder(b).append("=").append(c);

Compilador inteligente, não? :P

Até mais!

Nenhum comentário: