StringBuffer  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
EddiE
Virtual Machine Man

Membro desde: 31/08/2002 09:05:07
Mensagens: 647
Localização: São Paulo - SP
Offline


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

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


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

Membro desde: 14/08/2002 10:09:26
Mensagens: 1096
Localização: Sao Paulo
Offline

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:



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

-------------------------------------------------------
Guilherme Silveirahttp://blog.caelum.com.br
[Email] [WWW] [MSN]
Rafael Steil
Administrador
[Avatar]

Membro desde: 31/08/2002 02:35:53
Mensagens: 5984
Localização: São Paulo
Offline

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:



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:



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



é 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

"working code attracts people who want to code. Design documents attract people who want to talk about coding - Charles Miller"

http://rafaelsteil.com
http://twitter.com/rafaelsteil
http://www.jforum.net
http://www.flickr.com/photos/rafaelsteil
[Email] [WWW]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team