String é uma das classes mais amplamente utilizadas em Java. As classes StringBuffer e StringBuilder fornecem métodos para manipular strings. Vamos analisar a diferença entre StringBuffer e StringBuilder. StringBuffer vs StringBuilder é uma pergunta popular em entrevistas de Java.
String vs StringBuffer vs StringBuilder
A string é um dos tópicos mais importantes em entrevistas de Java. Se você está escrevendo um programa que imprime algo no console, você utiliza String. Este tutorial tem como foco as principais características da classe String. Em seguida, compararemos as classes StringBuffer e StringBuilder.
String em Java
-
A classe String representa cadeias de caracteres e pode ser instanciada de duas maneiras.
String str = "ABC"; // ou String str = new String("ABC");
-
String é imutável em Java. Portanto, é adequada para uso em ambientes multi-threaded. Podemos compartilhá-la entre funções sem se preocupar com inconsistência de dados.
-
Ao criarmos uma String usando aspas duplas, a JVM primeiro procura pela String com o mesmo valor no pool de strings. Se encontrada, ela retorna a referência do objeto de string do pool. Caso contrário, cria o objeto String no pool de strings e retorna a referência. A JVM economiza muita memória usando a mesma String em diferentes threads.
-
Se o operador new for usado para criar uma string, ela será criada na memória heap.
-
O operador + é sobrecarregado para String. Podemos usá-lo para concatenar duas strings. Embora internamente ele use StringBuffer para realizar essa ação.
-
A classe String substitui os métodos equals() e hashCode(). Duas Strings são iguais apenas se tiverem a mesma sequência de caracteres. O método equals() é sensível a maiúsculas e minúsculas. Se estiver procurando por verificações sem diferenciação de maiúsculas e minúsculas, você deve usar o método equalsIgnoreCase().
-
A string utiliza a codificação UTF-16 para o fluxo de caracteres.
-
A classe String é uma classe final. Todos os campos são finais, exceto “private int hash”. Este campo contém o valor da função hashCode(). O valor do hash é calculado apenas quando o método hashCode() é chamado pela primeira vez e depois armazenado em cache neste campo. Além disso, o hash é gerado usando os campos finais da classe String com alguns cálculos. Portanto, toda vez que o método hashCode() é chamado, ele resultará na mesma saída. Para o chamador, parece que os cálculos estão ocorrendo toda vez, mas internamente está em cache no campo hash.
String vs StringBuffer
Dado que String é imutável em Java, sempre que realizamos manipulação de String, como concatenação, substring, etc., gera-se uma nova String e descarta-se a String mais antiga para coleta de lixo. Essas são operações pesadas e geram muito lixo no heap. Portanto, o Java fornece as classes StringBuffer e StringBuilder que devem ser usadas para manipulação de String. StringBuffer e StringBuilder são objetos mutáveis em Java. Eles fornecem métodos como append(), insert(), delete() e substring() para manipulação de String.
StringBuffer vs StringBuilder
StringBuffer era a única escolha para manipulação de Strings até o Java 1.4. Mas, tem uma desvantagem de que todos os seus métodos públicos são sincronizados. StringBuffer oferece segurança de Thread mas a um custo de desempenho. Na maioria dos cenários, não usamos String em um ambiente multithread. Então, o Java 1.5 introduziu uma nova classe StringBuilder, que é similar ao StringBuffer exceto pela segurança de thread e sincronização. StringBuffer tem alguns métodos extras como substring, length, capacity, trimToSize, etc. No entanto, esses não são necessários uma vez que você tem todos esses presentes em String também. É por isso que esses métodos nunca foram implementados na classe StringBuilder. StringBuffer foi introduzido no Java 1.0 enquanto a classe StringBuilder foi introduzida no Java 1.5 após observar as deficiências do StringBuffer. Se você está em um ambiente de thread única ou não se preocupa com a segurança de thread, você deve usar StringBuilder. Caso contrário, use StringBuffer para operações seguras de thread.
StringBuilder vs Desempenho do StringBuffer
I am trying to check the effect on performance because of synchronization with a sample program that performs append()
on StringBuffer and StringBuilder object for multiple times.
package com.journaldev.java;
import java.util.GregorianCalendar;
public class TestString {
public static void main(String[] args) {
System.gc();
long start=new GregorianCalendar().getTimeInMillis();
long startMemory=Runtime.getRuntime().freeMemory();
StringBuffer sb = new StringBuffer();
//StringBuilder sb = new StringBuilder();
for(int i = 0; i<10000000; i++){
sb.append(":").append(i);
}
long end=new GregorianCalendar().getTimeInMillis();
long endMemory=Runtime.getRuntime().freeMemory();
System.out.println("Time Taken:"+(end-start));
System.out.println("Memory used:"+(startMemory-endMemory));
}
}
I ran the same code for the StringBuffer object also to check the time and memory values. I have executed the code 5 times for each case and then calculated the average values.
Value of i | StringBuffer (Time, Memory) | StringBuilder (Time, Memory) |
---|---|---|
10,00,000 | 808, 149356704 | 633, 149356704 |
1,00,00,000 | 7448, 147783888 | 6179, 147783888 |
Está claro que o StringBuilder tem um desempenho melhor que o StringBuffer mesmo no caso de um ambiente de thread única. Essa diferença no desempenho pode ser causada pela sincronização nos métodos do StringBuffer.
String vs StringBuffer vs StringBuilder
- A String é imutável enquanto StringBuffer e StringBuilder são classes mutáveis.
- StringBuffer é thread-safe e sincronizado enquanto StringBuilder não é. Por isso, StringBuilder é mais rápido que StringBuffer.
- O operador de concatenação de String (+) internamente utiliza a classe StringBuffer ou StringBuilder.
- Para manipulações de String em um ambiente não multi-threaded, devemos usar StringBuilder, caso contrário, usar a classe StringBuffer.
Isso é tudo para um rápido resumo das diferenças entre String, StringBuffer e StringBuilder. StringBuilder é mais adequado que StringBuffer na maioria dos cenários de programação geral. Referências:
Source:
https://www.digitalocean.com/community/tutorials/string-vs-stringbuffer-vs-stringbuilder