Back-End

23 jan, 2009

StringBuilder e StringBuffer: Qual a diferença?

Publicidade

Salve! Salve! Pessoal! O artigo dessa semana vai apresentar as diferenças entre StringBuilder e StringBuffer e saber quando usá-las. Além disso, apresentarei alguns exemplos em código Java usando essas classes. Espero que gostem! Não deixem de passar no meu blog http://camilolopes.wordpress.com 🙂

StringBuilder e StringBuffer: Qual a diferença?

Essas classes vieram para salvar um problema familiar da class String: “objetos perdidos na memória”. Sendo assim, veremos a diferença entre StringBuilder e StringBuffer. Na buffer os métodos são sincronizados já na builder não. Essa é a única diferença entre as classes.

A sincronização afeta o desempenho, então, a StringBuffer tende a ser mais lenta que a builder. Você deve estar se perguntando: O que são métodos sincronizados?

Os métodos sincronizados são aqueles que apenas uma Thread acessa por vez.

Por que usar StringBuilder & StringBuffer

O uso dessas classes ocorre quando precisamos usar e manipular muitas strings de caracteres, porém não queremos deixar objetos perdidos na memória. Em alguns minutos a memória estoura. Costumamos dizer que a “a memória perdeu a paciência” Veja um exemplo de como trabalhar com a classe StringBuilder.

StringBuilder sb = new StringBuilder();
Sb.append("camilo"); 
System.out.println(sb);

A questão é que StringXXX(buffer ou builder) operam sobre o valor de quem a chamou. Em outras palavras, do objeto que chamou o método. Algo que não faz a classe String quando usamos o método concat () dela. É necessário criar uma nova String para concatenar na class String. Já com a StringBuilder ou StringBuffer, não vou precisar criar mais nenhum objeto como referência à classe.

No método append (StringXXX(buffer ou builder) posso adicionar o que quiser: int, char, double, float,String

Outros métodos da class StringBuilder/Buffer:

Reverse() – imprime de forma contrária

Insert() – insere algo na posição especificada

Delete() – deleta algo na posição início e fim.

Veja alguns exemplos de uso:

public class Sb3 {
	
public static void main(String[] args) {
StringBuilder sb =new StringBuilder();
sb.append("camilo");
sb.append(5);
System.out.println(sb);
System.out.println(sb.reverse());
	}}
/*imprime de forma reverse*/
public class SbMet {

	public static void main(String[] args) {
		StringBuilder sb1= new StringBuilder("camilo");
		//metodo que remove pelo indice 0 - 1
		sb1.delete(2, 4);
			System.out.println(sb1);
		sb1.append(" medeiros");
		//insere na posição 2 uma exclamação
		sb1.insert(2,"!");
			System.out.println(sb1);
		sb1.append(" neto");
		System.out.println(sb1.toString());
	}}
/*a vantagem de usar StringBuilder ou StringBuffer eh que nao tenho
objeto perdidos na minha memória assim otimização dela*/

Vejam esse, não compila:

public class Nosb {

	public static void main(String[] args) {
StringBuilder sb="lopes";
System.out.println(sb);
	}
}
//nao instanciei(new) o objeto
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	Type mismatch: cannot convert from String to StringBuilder

Observe que nenhuma das classes ficou com referências perdidas, gerando o “lixo de objetos na memória”.

Abraço a todos! E até a próxima!