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!