Diferença entre StringBuffer e StringBuilder

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

Obrigado,

Nadilson

Até!

StringBuffer é synchronized
StringBuilder não é …

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

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

Eu também duvido que a performance das duas seja assim tão diferente.

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

[code]package teste;

public class TesteSB {
public static void main(String[] args) {
long tm = System.currentTimeMillis();
testeBuffer();
System.out.println(System.currentTimeMillis()-tm);
tm = System.currentTimeMillis();
testeBuilder();
System.out.println(System.currentTimeMillis()-tm);
}

private static void testeBuffer() {
	StringBuffer sb = new StringBuffer();
	for(int i=0;i&lt10000000;i++) {
		sb.append(i);
	}
}
private static void testeBuilder() {
	StringBuilder sb = new StringBuilder();
	for(int i=0;i&lt10000000;i++) {
		sb.append(i);
	}
}

}
[/code]

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 …

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.

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.

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 :smiley:

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

Agora, quanto a sincronização, dá uma lida aqui. :wink: :
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).

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!

Muito obrigado por todas as respostas.