Diferença entre StringBuffer e StringBuilder  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
nadilsons
JavaGuru
[Avatar]

Membro desde: 25/09/2006 23:10:20
Mensagens: 222
Offline

Alguém sabe a diferença entre StringBuffer e StringBuilder?

Obrigado,

Nadilson

Jesus é o caminho, a verdade e a vida!
Reflection DSL - http://code.google.com/p/reflection-dsl
maquiavelbona
JWizard
[Avatar]

Membro desde: 29/06/2006 09:06:51
Mensagens: 2447
Localização: São Paulo - SP
Offline

Javadoc StringBuilder wrote:A mutable sequence of characters. This class provides an API compatible with StringBuffer, but with no guarantee of synchronization. This class is designed for use as a drop-in replacement for StringBuffer in places where the string buffer was being used by a single thread (as is generally the case). Where possible, it is recommended that this class be used in preference to StringBuffer as it will be faster under most implementations.


Javadoc StringBuffer wrote:Every string buffer has a capacity. As long as the length of the character sequence contained in the string buffer does not exceed the capacity, it is not necessary to allocate a new internal buffer array. If the internal buffer overflows, it is automatically made larger. As of release JDK 5, this class has been supplemented with an equivalent class designed for use by a single thread, StringBuilder. The StringBuilder class should generally be used in preference to this one, as it supports all of the same operations but it is faster, as it performs no synchronization.

Até!

----------------------------------------------------------------
"Within a few years a simple and inexpensive device, readily carried about, will enable one to receive on land or sea the principal news, to hear a speech, a lecture, a song or play of a musical instrument, conveyed from any other region of the globe. "
Nikola Tesla - A means for furthering Peace (1905)

"Gedanken ohne Inhalt sind leer, Anschauungen ohne Begriffe sind blind."
Immanuel Kant - Kritik der reinen Vernunft (1781)
urubatan
Moderador
[Avatar]

Membro desde: 21/09/2002 10:31:26
Mensagens: 2481
Localização: Porto Alegre/RS
Offline

StringBuffer é synchronized
StringBuilder não é ...

ou seja, StringBuilder tende a ser bem mais rápido

[]'s
Rodrigo Urubatan
http://www.urubatan.com.br
Melhor livro de RoR do brasil: http://livro.urubatan.com.br
[WWW]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

A busca no próprio forum as vezes ajuda :
http://www.guj.com.br/posts/list/48531.java

Eu também duvido que a performance das duas seja assim tão diferente.
[WWW]
urubatan
Moderador
[Avatar]

Membro desde: 21/09/2002 10:31:26
Mensagens: 2481
Localização: Porto Alegre/RS
Offline

na verdade é uma diferença consideravel sim ...
por exemplo, olha este teste:


o output dele é:
3373
2951


ou seja, a diferença é de praticamente 14% só neste caso com inteiros, e pode aumentar dependendo da forma como for utilizada ...


[]'s
Rodrigo Urubatan
http://www.urubatan.com.br
Melhor livro de RoR do brasil: http://livro.urubatan.com.br
[WWW]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Primeiro, cuidado com o microbenchmark.

Em segundo lugar, mesmo o seu benchmark indica que em 10000000 concatenações, você teve 1 segundo de tempo a mais. Ok, são 14%, mas ambas as classes são rápidas o suficiente para que, na absoluta maioria das vezes, isso não seja perceptível ao usuário final.
[WWW]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Só um comentário.

Inverti o Buffer e o Builder e fiz um segundo teste... A diferença caiu muito.

Creio que na primeira execução o Java gere algum tipo de buffer, que beneficia quem roda em segundo lugar.

Por isso novamente: cuidado com o microbenchmark.

Ainda assim, eu usaria o StringBuilder no lugar do Buffer. Não só pelo fato de ser mais rápido, mas também por não criar estruturas necessárias para a exclusão mútua entre as Threads. Fora que, via de regra, você não precisa de uma classe ThreadSafe.
[WWW]
urubatan
Moderador
[Avatar]

Membro desde: 21/09/2002 10:31:26
Mensagens: 2481
Localização: Porto Alegre/RS
Offline

extranho, eu inverti aqui e tive exatamente o mesmo resultado ...

mas tudo bem, foi só um exemplo ...
e se tu quer tanto cuidado com o microbenchmark ...
então adiciona um outro loop igual mas com concatenação de strings e fica esperando ele terminar

[]'s
Rodrigo Urubatan
http://www.urubatan.com.br
Melhor livro de RoR do brasil: http://livro.urubatan.com.br
[WWW]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Concatenação de string sim, dá uma diferença realmente consideravel.

Agora, quanto a sincronização, dá uma lida aqui. :
http://www-128.ibm.com/developerworks/java/library/j-jtp04223.html?ca=dgr-lnxw07-obg-JavaMyths

E sobre benchmark (muito do que diz aqui vale para esse caso):
http://www-128.ibm.com/developerworks/java/library/j-jtp02225.html

Ah sim, note que eu não disse que não era mais lento. Isso é... mas só que a diferença não será perceptível, na maior parte das vezes (como no caso da concatenação).

[WWW]
lavh
GUJ Master

Membro desde: 30/07/2006 16:09:55
Mensagens: 1311
Offline

Pow...muito legal seus posts Vini! Foram muito bons para desmistificar alguns mitos! Esses artigos da IBM são bem legais.

Parabéns

Abraços!
nadilsons
JavaGuru
[Avatar]

Membro desde: 25/09/2006 23:10:20
Mensagens: 222
Offline

Muito obrigado por todas as respostas.

Jesus é o caminho, a verdade e a vida!
Reflection DSL - http://code.google.com/p/reflection-dsl
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team