O que é a Classe StringBuilder?

Como o assunto diz eu gostaria de saber para que serve a classe StringBuilder :slight_smile: grato pessoal !!

Olá,

A classe String é imutável. Assim, se você faz:

String s = "estou " ;
s += "concatenando ";
s += "strings!";

vc acabou de alocar 3 objetos da classe String na memória! Ok, o garbage collector logo passa e recolhe essa galera, mas quando? Não há garantia, e se isso acontece MUITO, pode representar um gasto desnecessário de memória.

A classe StringBuilder serve para resolver esse problema. Você declara o objeto e vai fazendo append das novas strings, sem precisar alocar novos objetos.

StringBuilder builder = new StringBuilder();
builder.append("estou ");
builder.append("concatenando ");
builder.append("strings!");
System.out.println(builder.toString());

Só complementando a explicação.

A String foi feita para ser imutável. Portanto, não é possível altera-la.

Quando você faz:
String x = “Vinícius”
String y = “Godoy”
String novaString = x + " " + y;

Você criou 4 objetos String. Um deles para a palavra Vinícius, outro para o espaço, outro para a palavra Godoye a String final, com o nome “Vinícius Godoy”.

Como não foi prevista mutabilidade na String, a classe não foi preparada para que operações como a concatenação ou substituição fossem eficientes. A VM consegue otimizar o uso dos strings até certo aspecto, mas ainda sim, é extremamente lento concatenar strings da forma acima.

Para isso, criaram as classes StringBuilder e StringBuffer. Basicamente elas são Strings mutáveis. Foi colocado no projeto dessas classes métodos para alterar ou modificar o conteúdo interno, sem que necessariamente um novo objeto seja criado.

Mais do que isso, o código interno dessas classes foi projetado para ser extremamente rápido. O quão mais rápido, segundo diz o item 33 do capítulo 7 do livro Effective Java, cerca de 9 vezes mais rápido para um bloco de 800 caracteres.

2 curtidas

po uso dessa classe é essencial quando vc precisa manipular muitas String’s e realmente é show de bola… se vc ja programou em outras linguaguens normalmente ou até no java faz isso:

String nome;
String sobrenome;
String cidade;

Bom o uso de manipulação de muita String vai afetar o consumo de memoria, ahhh mais aonde vai rodar o sistema tem 2 GB ahahaha, mais lembre-se lea é finita e a class String quando vc cria um objeto que referencia ela… ele ta na memoria para sempre… e nunca sera apagado… pode ser “esquecido” quando vc tem um novo valor, mas sempre ele vai estar no endereço aonde foi criado… veja um exemplo.

String nome="camilo";
String estado = "ba";
 nome += nome + estado;

o que acontece com a sinxtaxe acima? vc tem um novo objeto que referencia a um novo valor na String " camilo ba", vc poderia ter:

String resultado += nome + estado;

porem ali so usei um nome de uma variavel e apontei, ops, nao eh C referencia para um novo valor é que a concatenação de nome + estado.
Ahh isso ja sabia… mas observe que a variavel estado provavelmente vc nao a use…vamos supor que sim… mas eh um objeto criado na memoria… ahh e tb vc tem la um variavel com o valor nome = “camilo” criado na memoria porem perdido… ocupado espaçõ… e isso eh ruim… nao acha? quando vc desenvolver o sistema tanto vc quanto seu cliente que q ele rode de forma mais rapida possivel… output e input’s seja bastante satisfatorio…
ai que entra a StringBuilder - que uma classe que opera em cima do objeto chamador… essa classe ela nao cria objetos perdidos na memoria… na verdade ela eh uma String aprimorada… “anabolizada” como o ArrayList (se nao souber faça uma pesquisa) é um Array anabolizado.
olha como funciona StirngBuilder:

StringBuilder nome = new StringBuilder("camilo");
nome.append("neto");
System.out.println(nome);
//imprime camilo neto

onde estar o objeto perdido? nao temos… objetos perdidos ele operou em cima de chamou o metodo para adicionar… ou seja quem chamou? minha variavel nome.

bom basicamente é isso eu usso StringBuilder ate em programas bem mais simples que seja ja ate acostumei… mas isso nao quer dizer que vc deve esquecer a String… com a medida dos estudos, e pratica vc percebe quando usar um ou outro…pois cada momento eh um momento diferente concorda?

valeu!! espero ter ajudado…

Voces me ajudaram muito mas eu gostaria de saber se eu posso( devo ) em tão sempre ultilizar a Classe StringBuilder ao invez da Classe String …

Eu seu que não pois o Camilo já disse, mas eu gostaria de saber quando ultilizar uma e outro :slight_smile: agradeço se alguem me ajudar !!! :roll:

Sempre que for fazer concatenações em métodos que podem ser colocados dentro de um loop, sim.

Não é necessário no caso de um método que só vai ser acessado uma vez, ou quando você está montando uma mensagem para uma exceção, por exemplo.

[b]hey pessoal…não entendi muito sobre o StringBuilder…ficou um ? bem na minha cabeça…sabe sou nova aqui…estou no 1º modulo do tec. informatica de redes e comunicação. e vi isso hoje…não entendi mto bem…tem como alguém me ajudar??? por favor??[color=violet][/color]

quem disse que a String é imutável?

http://blog.caelum.com.br/2007/05/21/strings-imutaveis/

pelo amor de Deus… não façam isso nunca na vida…rs

[quote=marcelo_mococa]quem disse que a String é imutável?

http://blog.caelum.com.br/2007/05/21/strings-imutaveis/

pelo amor de Deus… não façam isso nunca na vida…rs[/quote]

Com reflexão não vale! Aí nem mesmo private são privados, singletons não são singletons, etc…

foi só uma brincadeirinha…rs

Excelentes explicações para StringBuilder.

Mas alguém poderia me explicar a diferença entre ela e StringBuffer?

[ ]

os métodos da StringBuffer são sincronizados… apenas isso.

[quote=jPscoralicK]Excelentes explicações para StringBuilder.

Mas alguém poderia me explicar a diferença entre ela e StringBuffer?

[ ][/quote]

a questao da Buffer é quando vc ver threads… que vai entender a diferença… mais como teoria… a StringBuffer é mais lenta… por os seus metodos serem sincronizados como o amigo acima falou… o que quer dizer isso? significa que duas instancias nao pode operar ao mesmo temo o estado do objeto… mais assim… sempre use StringBuilder… quando estudar Threads ai vai saber quando usar a StringBuffer… hehe… a diferença é so essa uma mais rapida Builder e outra mais lenta Buffer…

[quote=jPscoralicK]Excelentes explicações para StringBuilder.

Mas alguém poderia me explicar a diferença entre ela e StringBuffer?

[ ][/quote]

como o colega maracuja disse:

ela não garante a sincronização.

ou seja,

em ambiente que usam threads, use a StringBuffer. Em ambiente normais ela eh mais rapida que que StringBuffer

100% pessoal.

valeu!

[ ]

[quote=marcosbrandao]ou seja,

em ambiente que usam threads, use a StringBuffer. Em ambiente normais ela eh mais rapida que que StringBuffer[/quote]

Não dá para levar isso como regra.

Mesmo em ambientes multi-threaded, geralmente há pouca (ou nenhuma) razão para usar um StringBuffer. Explico o porque:

  1. Você teria que ter duas threads trabalhando sobre o mesmo StringBuffer ao mesmo tempo;
  2. Não existe sincronismo entre a chamada de dois métodos, portanto, cada thread deverá inserir a informação completa no StringBuffer toda vez que chama-lo;
  3. Em 90% dos casos, a sincronização do objeto que usa o StringBuilder é suficiente para garantir quaisquer restrições multi-threaded que existem sobre ele.

[quote=ViniGodoy][quote=marcosbrandao]ou seja,

em ambiente que usam threads, use a StringBuffer. Em ambiente normais ela eh mais rapida que que StringBuffer[/quote]

Não dá para levar isso como regra.

Mesmo em ambientes multi-threaded, geralmente há pouca (ou nenhuma) razão para usar um StringBuffer. Explico o porque:

  1. Você teria que ter duas threads trabalhando sobre o mesmo StringBuffer ao mesmo tempo;
  2. Não existe sincronismo entre a chamada de dois métodos, portanto, cada thread deverá inserir a informação completa no StringBuffer toda vez que chama-lo;
  3. Em 90% dos casos, a sincronização do objeto que usa o StringBuilder é suficiente para garantir quaisquer restrições multi-threaded que existem sobre ele.[/quote]

Legal saber isso…

Não tenho muito conhecimento sobre threads.
Postei o q eu aprendi e o q ta escrito na API.

Mas é isso aí. Vivendo e aprendendo…

[quote]Olá,

A classe String é imutável. Assim, se você faz:
Code:

String s = "estou " ;
s += "concatenando ";
s += “strings!”;

vc acabou de alocar 3 objetos da classe String na memória! Ok, o garbage collector logo passa e recolhe essa galera, mas quando? Não há garantia, e se isso acontece MUITO, pode representar um gasto desnecessário de memória. [/quote]

Na verdade o buraco é mais embaixo, se não me engano no seu código sao criados 5 objetos…

Seguinte… temos " estou " , depois é criado o objeto "concatenando " (Abandonado ) e depois o objeto " estou concatenando “, depois é criado o objeto “Strings” (abandonado) e depois " Estou concatenando Strings”

Certo ??? Por isso é muito mais util e economico o StringBuilder ou Buffer ( depende do que voce precisa ) …

Para mais informações sobre isso, leia o item 33 do capítulo 7 do livro Effective Java.

O referido capítulo pode ser encontrado aqui.

Nota: Quando o capítulo foi escrito, a classe StringBuilder ainda não existia. Hoje, é preferível usar StringBuilder ao StringBuffer na maior parte das situações.

E por que eu retorno ‘System.out.println(builder.toString());’
Por que tem que ser “.toString()”?