StringBuffer

:?:
Ao trabalhar com um objeto StringBuffer posso fazer a seguinte concatenação

que a compilação não gera nenhum erro. Internamente isto consome muita memória? O Java interpreta como append() o sinal de +?

A Virtual Machine ira criar cerca de 5 objetos de tipo String sem contar os que ja tinham sido criados (variavel_Nome e variavel_Endereco) que nao tenho certeza se sao Strings ou nao (podem ser int’s ou outros objetos quaisquer).
Uma vez que seu objetivo eh usar a classe StringBuffer entao eh mais rapido utilizar o seguinte codigo:

StringBuffer sb = new StringBuffer("Nome:"); sb.append(variavel_Nome); sb.append("Endereco:"); sb.append(variavel_Endereco);

Fazendo o teste com o seu codigo e com o meu, variavel_Nome=new String(“Guilherme”), variavel_Endereco=new String(“Carl-diem Strasse 33”), para um loop de 5.000.000 vezes tenho o resultado abaixo. (TODAS as variaveis sao criadas com NEW dentro do codigo do for)

Seu codigo: 11173 msecs
Meu codigo: 8468 msecs

Isso significa que eh claro que seu codigo ira rodar extremamente rapido, uma vez que ele cria soh 5 objetos. Porem o codigo que mostrei ira rodar ainda mais rapido, e numa aplicacao onde o trabalho com Strings eh enorme pode ser MUITO mais aconselhavel o segundo metodo (20% mais rapido).

Espero ter ajudado…

Guilherme Silveira

Apenas complementando a explicação do Guilherme, quando você concatena alguma String usando o operador +, o Java cria uma instância da classe StringBuffer com o conteúdo a ser concatenado, aplica o método append() e então retorna usando o método toString().

Em termos de código, seria mais ou menos assim:

// Concatena usando o operador +
String s1 = "Parte 1";
s1 += " Parte 2";
s1 += " Parte 3";

nesse exemplo o que aconte é o seguinte: um objeto do tipo String é criado na memória, com uma referência à string “Parte 1” apontando para tal objeto, e consecutivamente ( em cada nova concatenação ) é criado um novo objeto do tipo String. As chamadas a concatenação são ser traduziadas da seguinte forma:

s1 = new StringBuffer().append("Parte 1").append(" Parte 2").append(" Parte 3").toString();

Logicamente isso não é nada otimizado. Por isso que fazer

StringBuffer s1 = new StringBuffer("Parte 1");
s1.append(" Parte 2");
s1.append(" Parte 3");

é o recomendável, já que não são criados vários objetos String desnecessariamente. Uma dica simples para se lembrar desse detalhe é a seguinte: o tipo String em Java é imutável, você não consegue alterar o valor de uma variável String sem criar um objeto novo. StringBuffer É mutável. Portanto, se você precisa, em algum momento alterar o conteúdo da string, utilize StringBuffer, caso contrário utlilize String.

Rafael