Qual é a principal diferença entre StringBuffer
e StringBuilder
? Há algum problema de desempenho ao decidir sobre qualquer um deles?
java
stringbuilder
stringbuffer
Tigre preto
fonte
fonte
StringBuilder
é mais rápido do queStringBuffer
porque não ésynchronized
.Aqui está um teste de benchmark simples:
Uma execução de teste fornece os números de
2241 ms
forStringBuffer
vs753 ms
forStringBuilder
.fonte
--> 0
um loop. Levei um momento para perceber o que isso significa. Isso é algo que é realmente usado na prática, em vez da...; i > 0; i--
sintaxe usual ?i -->
é realmente irritante em termos de sintaxe ... Eu pensei que era uma flecha a princípio por causa dos comentários sobre a arte ASCII.main()
Além disso, seu benchmark é injusto. Não há aquecimento.Basicamente, os
StringBuffer
métodos são sincronizados enquantoStringBuilder
não são.As operações são "quase" iguais, mas o uso de métodos sincronizados em um único encadeamento é um exagero.
É praticamente isso.
Citação da API StringBuilder :
Então foi feito para substituí-lo.
O mesmo aconteceu com
Vector
eArrayList
.fonte
Hashtable
eHashMap
.Basta usar, a
StringBuilder
menos que você esteja realmente tentando compartilhar um buffer entre os threads.StringBuilder
é o irmão mais novo não sincronizado (menos sobrecarga = mais eficiente) daStringBuffer
classe sincronizada original .StringBuffer
veio primeiro. A Sun estava preocupada com a correção em todas as condições, por isso a sincronizaram para garantir a segurança de threads.StringBuilder
veio mais tarde. A maioria dos usosStringBuffer
era de thread único e pagava desnecessariamente o custo da sincronização.Como
StringBuilder
é um substituto substituto paraStringBuffer
sem a sincronização, não haveria diferenças entre nenhum exemplo.Se você está tentando compartilhar entre threads, pode usar
StringBuffer
, mas considere se a sincronização de nível superior é necessária, por exemplo, talvez em vez de usar StringBuffer, você deve sincronizar os métodos que usam o StringBuilder.fonte
Primeiro vamos ver as semelhanças : StringBuilder e StringBuffer são mutáveis. Isso significa que você pode alterar o conteúdo deles, no mesmo local.
Diferenças : StringBuffer é mutável e sincronizado também. Onde, como StringBuilder, é mutável, mas não sincronizado por padrão.
Significado de sincronizado (sincronização) : quando algo é sincronizado, vários threads podem acessar e modificá-lo sem nenhum problema ou efeito colateral. StringBuffer é sincronizado, para que você possa usá-lo com vários threads sem qualquer problema.
Qual usar quando? StringBuilder: quando você precisa de uma string, que pode ser modificável, e apenas um thread a está acessando e modificando. StringBuffer: quando você precisa de uma string, que pode ser modificável, e vários threads a acessam e modificam.
Nota : Não use StringBuffer desnecessariamente, ou seja, não use-o se apenas um segmento estiver modificando e acessando-o, pois possui muito código de bloqueio e desbloqueio para sincronização, o que consumirá desnecessariamente o tempo da CPU. Não use bloqueios, a menos que seja necessário.
fonte
Em threads únicos, o StringBuffer não é significativamente mais lento que o StringBuilder , graças às otimizações da JVM. E no multithreading, você não pode usar com segurança um StringBuilder.
Aqui está o meu teste (não uma referência, apenas um teste):
Resultados:
strings: 319740
Buffers: 23
Construtor: 7!
Portanto, os construtores são mais rápidos que os buffers e muito mais rápidos que a concatenação de strings. Agora vamos usar um Executor para vários threads:
Agora, os StringBuffers levam 157 ms para 100000 anexos. Não é o mesmo teste, mas comparado aos 37 ms anteriores, você pode assumir com segurança que os anexos de StringBuffers são mais lentos com o uso de multithreading . O motivo é que o JIT / hotspot / compiler / something faz otimizações quando detecta que não há necessidade de verificar bloqueios.
Mas com StringBuilder, você tem java.lang.ArrayIndexOutOfBoundsException , porque um encadeamento simultâneo tenta adicionar algo que não deveria.
A conclusão é que você não precisa perseguir StringBuffers. E onde você tem tópicos, pense no que eles estão fazendo, antes de tentar ganhar alguns nanossegundos.
fonte
withString+="some string"+i+" ; ";
não é equivalente aos outros dois loops e, portanto, não é uma comparação justa.O StringBuilder foi introduzido no Java 1.5 para não funcionar com JVMs anteriores.
Dos Javadocs :
fonte
StringBuilder
.Aqui estão as diferenças, notei:
StringBuffer: -
StringBuilder: -
Coisa comum :-
fonte
StringBuffer
StringBuilder
StringBuffer
sem nenhuma outra alteraçãofonte
append
duas vezes, ouappend
etoString
não, não é seguro.StringBuilder não é seguro para threads. O buffer de cadeia é. Mais informações aqui .
EDIT: Quanto ao desempenho, após o hotspot começar, o StringBuilder é o vencedor. No entanto, para pequenas iterações, a diferença de desempenho é insignificante.
fonte
StringBuilder
eStringBuffer
são quase os mesmos. A diferença é queStringBuffer
está sincronizado eStringBuilder
não está. Embora,StringBuilder
seja mais rápido queStringBuffer
, a diferença de desempenho é muito pequena.StringBuilder
é um substituto de SUNStringBuffer
. Apenas evita a sincronização de todos os métodos públicos. Em vez disso, sua funcionalidade é a mesma.Exemplo de bom uso:
Se o seu texto for alterado e for usado por vários threads, é melhor usá-lo
StringBuffer
. Se o seu texto for alterado, mas for usado por um único thread, useStringBuilder
.fonte
StringBuffer
StringBuffer é mutável significa que é possível alterar o valor do objeto. O objeto criado por meio de StringBuffer é armazenado no heap. StringBuffer possui os mesmos métodos que o StringBuilder, mas cada método no StringBuffer é sincronizado, ou seja, StringBuffer é seguro para threads.
por isso, não permite que dois threads acessem simultaneamente o mesmo método. Cada método pode ser acessado por um thread por vez.
Mas ser seguro para threads também tem desvantagens, pois o desempenho do StringBuffer atinge devido à propriedade segura para threads. Portanto, StringBuilder é mais rápido que o StringBuffer ao chamar os mesmos métodos de cada classe.
O valor StringBuffer pode ser alterado, significa que pode ser atribuído ao novo valor. Hoje em dia é uma pergunta de entrevista mais comum, as diferenças entre as classes acima. O buffer de string pode ser convertido em string usando o método toString ().
StringBuilder
StringBuilder é igual ao StringBuffer, ou seja, armazena o objeto na pilha e também pode ser modificado. A principal diferença entre o StringBuffer e o StringBuilder é que o StringBuilder também não é seguro para threads. O StringBuilder é rápido, pois não é seguro para threads.
Recurso: String Vs StringBuffer Vs StringBuilder
fonte
String
é um imutável.StringBuffer
é um mutável e sincronizado.StringBuilder
também é mutável, mas não está sincronizado.fonte
O javadoc explica a diferença:
fonte
StringBuilder
(introduzido no Java 5) é idêntico aStringBuffer
, exceto que seus métodos não são sincronizados. Isso significa que ele tem um desempenho melhor que o último, mas a desvantagem é que não é seguro para threads.Leia o tutorial para mais detalhes.
fonte
Um programa simples que ilustra a diferença entre StringBuffer e StringBuilder:
fonte
StringBuffer é usado para armazenar seqüências de caracteres que serão alteradas (os objetos String não podem ser alterados). Expande automaticamente conforme necessário. Classes relacionadas: String, CharSequence.
O StringBuilder foi adicionado no Java 5. É idêntico em todos os aspectos ao StringBuffer, exceto pelo fato de não estar sincronizado, o que significa que se vários encadeamentos estiverem acessando-o ao mesmo tempo, poderá haver problemas. Para programas de thread único, o caso mais comum, evitando a sobrecarga da sincronização, torna o StringBuilder muito mais rápido.
fonte
StringBuilder
geralmente são locais para um método, onde são visíveis para apenas um thread.StringBuffer
está sincronizado, masStringBuilder
não está. Como resultado,StringBuilder
é mais rápido queStringBuffer
.fonte
StringBuffer é mutável. Pode mudar em termos de tamanho e conteúdo. StringBuffers são seguros para threads, o que significa que eles têm métodos sincronizados para controlar o acesso, para que apenas um thread possa acessar o código sincronizado de um objeto StringBuffer por vez. Portanto, os objetos StringBuffer geralmente são seguros para uso em um ambiente com vários threads em que vários threads podem estar tentando acessar o mesmo objeto StringBuffer ao mesmo tempo.
StringBuilder A classe StringBuilder é muito semelhante ao StringBuffer, exceto que seu acesso não é sincronizado para que não seja seguro para threads. Por não ser sincronizado, o desempenho do StringBuilder pode ser melhor que o StringBuffer. Portanto, se você estiver trabalhando em um ambiente de thread único, o uso de StringBuilder em vez de StringBuffer pode resultar em aumento de desempenho. Isso também se aplica a outras situações, como uma variável local StringBuilder (ou seja, uma variável dentro de um método) em que apenas um thread acessará um objeto StringBuilder.
fonte
StringBuffer:
StringBuilder
fonte
String c = a + b
é equivalente aString c = new StringBuilder().append(a).append(b).toString()
, portanto, não é mais rápido. É só que você criar um novo para cada atribuição corda, enquanto você poderia ter apenas um (String d = a + b; d = d + c;
éString d = new StringBuilder().append(a).append(b).toString(); d = new StringBuilder().append(d).append(c).toString();
ao mesmo tempoStringBuilder sb = new StringBuilder(); sb.append(a).append(b); sb.append(c); String d = sb.toString();
iria salvar uma instanciação StringBuilder).Construtor de String :
Buffer de String
É recomendável usar o StringBuilder sempre que possível, porque é mais rápido que o StringBuffer. No entanto, se a segurança do encadeamento for necessária, a melhor opção são os objetos StringBuffer.
fonte
Melhor uso,
StringBuilder
pois não é sincronizado e, portanto, oferece melhor desempenho.StringBuilder
é um substituto direto do antigoStringBuffer
.fonte
StringBu(ff|ild)er
é uma variável local usada apenas por um único thread.Como
StringBuffer
é sincronizado, ele precisa de algum esforço extra, portanto, com base no desempenho, é um pouco mais lento queStringBuilder
.fonte
Não há diferenças básicas entre
StringBuilder
eStringBuffer
, existem apenas algumas diferenças entre eles. NosStringBuffer
métodos são sincronizados. Isso significa que por vez, apenas um segmento pode operar com eles. Se houver mais de um encadeamento, o segundo encadeamento terá que aguardar o término do primeiro e o terceiro precisará aguardar o término do primeiro e do segundo e assim por diante. Isso torna o processo muito lento e, portanto, o desempenho no caso deStringBuffer
é baixo.Por outro lado,
StringBuilder
não está sincronizado. Isso significa que ao mesmo tempo vários threads podem operar no mesmoStringBuilder
objeto ao mesmo tempo. Isso torna o processo muito rápido e, portanto, o desempenhoStringBuilder
é alto.fonte
A
String
é um objeto imutável, o que significa que o valor não pode ser alterado enquantoStringBuffer
é mutável.O
StringBuffer
é sincronizado, portanto, é seguro para threads, enquantoStringBuilder
não é adequado para apenas instâncias de thread único.fonte
A principal diferença é
StringBuffer
está sincronizado masStringBuilder
é not.If você precisa usar mais de um segmento, então StringBuffer é recommended.But, de acordo com a velocidade de execuçãoStringBuilder
é mais rápido queStringBuffer
, porque não é sincronizado.fonte
Verifique as características internas do método de acréscimo sincronizado
StringBuffer
e do método de acréscimo não sincronizado deStringBuilder
.StringBuffer :
StringBuilder :
Como o anexo é
synchronized
,StringBuffer
possui uma sobrecarga de desempenho em comparação com oStrinbBuilder
cenário de multiencadeamento. Contanto que você não esteja compartilhando buffer entre vários encadeamentos, useStringBuilder
, o que é rápido devido à ausência desynchronized
métodos append.fonte
Aqui está o resultado do teste de desempenho para String vs StringBuffer vs StringBuilder . Finalmente, o StringBuilder venceu o teste. Veja abaixo o código e o resultado do teste.
Código :
Execute Me no ideone
Resultado :
100000 iteração para adicionar um único texto
10000 iteração para adicionar um único texto
fonte
fonte
StringBuffer é sincronizado e seguro para threads, StringBuilder não é sincronizado e mais rápido.
fonte