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:
Postar um comentário