Você está aqui: Java ::: Pacote java.lang ::: StringBuffer |
Quais as diferenças entre as classes String e StringBuffer? Quando devo substituir uma pela outra?Quantidade de visualizações: 2863 vezes |
Tanto a classe String quanto a classe StringBuffer (e seu irmão para código não sincronizado StringBuilder) facilitam nosso trabalho na hora de manipular strings. Mas, há diferenças interessantes entre estas duas classes. Vamos começar pela classe String. Um objeto String é IMUTÁVEL, ou seja, uma vez criado, seu conteúdo não pode ser modificado. Qualquer modificação ocasiona a criação de um novo objeto String. Veja o trecho de código abaixo: package estudos; public class Estudos{ public static void main(String[] args) { // criamos um objeto da classe String e usamos a variável frase para // referenciá-lo String frase = "Gosto de C e Java"; // agora a variável frase2 é uma referência ao objeto String criado anteriormente String frase2 = frase; System.exit(0); } } O que ocorre neste código é que o compilador mantém apenas um cópia do texto "Gosto de C e Java" e ambas as variáveis frase e frase2 apontam (referenciam) este texto. Veja agora: package estudos; public class Estudos{ public static void main(String[] args) { // criamos um objeto da classe String e usamos a variável frase para // referenciá-lo String frase = "Gosto de C e Java"; // agora a variável frase2 aponta para um novo objeto String String frase2 = frase.toUpperCase(); // vamos exibir o conteúdo da variável frase System.out.println(frase); // vamos exibir o conteúdo da variável frase2 System.out.println(frase2); System.exit(0); } } Ao executarmos este código nós teremos o seguinte resultado: Gosto de C e Java GOSTO DE C E JAVA Veja que agora nós efetuamos um chamada ao método toUpperCase() do objeto frase e atribuímos o resultado à variável frase2. E aqui eu destaco bem o conceito de imutabilidade. Em vez de converter o conteúdo da string original para letras maiúsculas, o compilador criou um novo objeto String (guardando a frase em letras maiúsculas) e o atribuiu à variável frase2. Assim, baseado neste experimento, podemos concluir que todas as vezes que modificamos o conteúdo de uma String, o compilador cria um novo objeto String e descarta o anterior. A memória ocupada pelo String anterior será liberado somente após o Garbage Collector detectar os objetos sem referência e proceder com a limpeza. A classe StringBuffer (e também StringBuilder), por sua vez, é MUTÁVEL, ou seja, as modificações que fazemos em objetos desta classe são mantidas no mesmo objeto. Nenhum novo objeto é criado. Veja: package estudos; public class Estudos{ public static void main(String[] args) { // criamos um objeto da classe StringBuffer e usamos a variável frase para // referenciá-lo StringBuffer frase = new StringBuffer("Gosto de C e Java"); // agora a variável frase2 aponta para uma alteração no objeto StringBuffer anterior StringBuffer frase2 = frase.append(" e PHP."); // vamos exibir o conteúdo da variável frase System.out.println(frase); // vamos exibir o conteúdo da variável frase2 System.out.println(frase2); System.exit(0); } } Ao executarmos este código nós teremos o seguinte resultado: Gosto de C e Java e PHP. Gosto de C e Java e PHP. Veja que agora a alteração no conteúdo do StringBuffer foi refletida tanto na variável frase quanto frase2. |
![]() |
Desafios, Exercícios e Algoritmos Resolvidos de Java |
Veja mais Dicas e truques de Java |
Dicas e truques de outras linguagens |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
1º lugar: Java |