Diferença entre String vs StringBuilder

Neste artigo String vs StringBuilder, ambos representam a sequência de caracteres, a primeira diferença entre eles é a classe String no espaço para nome do sistema, enquanto StringBuilder está no sistema. Namespace de texto.

A principal diferença é:

String é imutável : depois de criar uma instância de String, você não pode alterá-la. Se você alterar o valor da sequência, isso manterá a instância antiga e criará uma nova instância com novo valor na memória.

StringBuilder é mutável : se você alterar o valor da string usando o StringBuilder, ele não criará uma nova instância, em vez disso, atualizará o valor na instância existente.

Comparação cara a cara entre String vs StringBuilder (Infográficos)

Abaixo estão as 8 principais comparações entre String e StringBuilder :

Principais diferenças entre String vs StringBuilder

Vamos discutir algumas diferenças importantes entre String vs StringBuilder nos seguintes pontos:

1. Ao trabalhar com a classe String, toda vez que você executa algumas operações na string, você recria a string inteira na memória repetidas vezes, enquanto o StringBuilder aloca algum espaço de buffer na memória e aplica modificações nesse espaço.

2. Como o objeto StringBuilder é mutável, ele oferece melhor desempenho em comparação ao objeto String quando estão envolvidas manipulações pesadas de cordas.

Vamos entender os pontos acima com a ajuda de um exemplo dado abaixo:

Código:

using System;
using System.Text;
using System.Diagnostics;
public class StringAndStringBuilder
(
static void Main()
(
//using Stopwatch to calculate time
Stopwatch stopWatch = new Stopwatch();
string str = string.Empty;
//starting stop watch
stopWatch.Start();
for (int i = 0; i < 1000; i++)
(
str += i.ToString();
)
stopWatch.Stop();
Console.WriteLine("Time taken by string : (0)", stopWatch.Elapsed);
StringBuilder stringBuilder= new StringBuilder(string.Empty);
//restarting stop watch for StringBuilder
stopWatch.Restart();
for (int i = 0; i < 1000; i++)
(
stringBuilder.Append(i.ToString());
)
stopWatch.Stop();
Console.WriteLine("Time taken by StringBuilder : (0)", stopWatch.Elapsed);
)
)

Resultado:

3. As operações de string usam mais memória em comparação com o StringBuilder porque o String cria instâncias de lixo intermediárias após cada operação. Vamos ver isso no exemplo abaixo:

Código:

using System;
using System.Text;
using System.Runtime.Serialization;
public class StringAndStringBuilder
(
public static void Main()
(
//using ObjectIDGenerator to generate ID for objects
ObjectIDGenerator idGenerator1 = new ObjectIDGenerator();
bool flag = new bool();
String str = "Sun";
Console.WriteLine("String = (0)", str);
Console.WriteLine("Instance Id : (0)", idGenerator1.GetId(str, out flag));
//flag will be True for new instance otherwise it will be False
Console.WriteLine("This instance is new : (0)\n", flag);
//concatenating strings
str += " rises";
Console.WriteLine("String = (0)", str);
Console.WriteLine("Instance Id : (0)", idGenerator1.GetId(str, out flag));
Console.WriteLine("this instance is new : (0)\n", flag);
str += " in";
Console.WriteLine("String = (0)", str);
Console.WriteLine("Instance Id : (0)", idGenerator1.GetId(str, out flag));
Console.WriteLine("this instance is new : (0)\n", flag);
str += " the";
Console.WriteLine("String = (0)", str);
Console.WriteLine("Instance Id : (0)", idGenerator1.GetId(str, out flag));
Console.WriteLine("this instance is new : (0)\n", flag);
str += " east";
Console.WriteLine("String = (0)", str);
Console.WriteLine("Instance Id : (0)", idGenerator1.GetId(str, out flag));
Console.WriteLine("this instance is new : (0)\n", flag);
//initializing string using StringBuilder
StringBuilder stringBuilder = new StringBuilder("Sun");
ObjectIDGenerator idGenerator2 = new ObjectIDGenerator();
Console.WriteLine("StringBuilder = (0)", stringBuilder);
Console.WriteLine("Instance Id : (0)", idGenerator2.GetId(stringBuilder, out flag));
Console.WriteLine("This instance is new : (0)\n", flag);
stringBuilder.Append(" rises");
Console.WriteLine("StringBuilder = (0)", stringBuilder);
Console.WriteLine("Instance Id : (0)", idGenerator2.GetId(stringBuilder, out flag));
Console.WriteLine("This instance is new : (0)\n", flag);
stringBuilder.Append(" in");
Console.WriteLine("StringBuilder = (0)", stringBuilder);
Console.WriteLine("Instance Id : (0)", idGenerator2.GetId(stringBuilder, out flag));
Console.WriteLine("This instance is new : (0)\n", flag);
stringBuilder.Append(" the");
Console.WriteLine("StringBuilder = (0)", stringBuilder);
Console.WriteLine("Instance Id : (0)", idGenerator2.GetId(stringBuilder, out flag));
Console.WriteLine("This instance is new : (0)\n", flag);
stringBuilder.Append(" east");
Console.WriteLine("StringBuilder = (0)", stringBuilder);
Console.WriteLine("Instance Id : (0)", idGenerator2.GetId(stringBuilder, out flag));
Console.WriteLine("This instance is new : (0)\n", flag);
Console.ReadKey();
)
)

Resultado:

Representação pictórica do trabalho interno do programa acima:

4. Os objetos String podem ser usados ​​em threads, enquanto os objetos StringBuilder não são seguros para threads. Portanto, dois ou mais threads podem chamar os métodos StringBuilder simultaneamente.

5. Como os objetos String são seguros para threads, eles fornecem sincronização, enquanto o StringBuilder não fornece sincronização.

6. A classe String é usada quando o valor da string permanecerá constante durante todo o programa ou quando houver muito menos modificações necessárias, enquanto o StringBuilder é usado quando muitas modificações repetidas ou operações pesadas são necessárias para executar a string.

7. Para um número muito menor de concatenações, a classe String funciona mais rapidamente em comparação com o StringBuilder porque acomodar caracteres no espaço do buffer e depois converter todo o valor em string cria uma sobrecarga. Portanto, para o pequeno número de concatenações, o StringBuilder funciona mais devagar quando comparado ao comportamento de copiar por valor da classe String.

8. Para converter o objeto String no objeto StringBuilder, precisamos passar o objeto String para o construtor da classe StringBuilder, enquanto o objeto StringBuilder pode ser convertido em String usando o método ToString ().

String str = “abc”;
StringBuilder StringBuilder = new StringBuilder(str);
StringBuilder StringBuilder = new StringBuilder(“abc”);
String str = StringBuilder.ToString();

Tabela de comparação de String vs StringBuilder

A tabela abaixo resume as comparações entre String e StringBuilder :

Parâmetro Corda StringBuilder
NamespaceA classe de sequência está no espaço de nome do sistema.A classe StringBuilder está no espaço de nome Texto do Sistema.
MutabilidadeString criada usando a classe String é imutável.String criada usando StringBuilder é mutável.
atuaçãoLento em comparação com o StringBuilder.Rápido em comparação com String. Como se fosse mais rápido que String, concatenando muitas seqüências juntas em um loop.
Segurança da linhaDiscussão segura.Não é seguro para threads.
SincronizaçãoFornece sincronização.Não fornece sincronização.
Uso de memóriaRequer mais memória para criar uma nova instância se as operações executadas na string alterarem seu valor.Requer menos memória, pois atualiza a instância existente.
Natureza do objetoObjeto de String é somente leitura por natureza.O objeto StringBuilder é de natureza dinâmica.
EficiênciaA classe String é menos eficiente em comparação com o StringBuilder enquanto trabalha com um grande número de concatenações de strings.StringBuilder é mais eficiente quando comparado a String enquanto trabalha com um grande número de concatenações de string.

Conclusão

String cria nova instância somente quando o valor da string é alterado. Se você executar determinadas operações na string que não altera seu valor, não haverá nenhuma nova criação de instância pela String. Dois ou mais literais de sequência com o mesmo conteúdo podem ter o mesmo local de memória.

Artigos recomendados

Este é um guia para a principal diferença entre String vs StringBuilder. Aqui também discutimos as diferenças de chave String vs StringBuilder com infográficos e tabela de comparação. Você também pode consultar os seguintes artigos para saber mais -

  1. Os 7 principais tipos de codificação
  2. Vantagens do StringBuilder em C #
  3. StringBuffer vs StringBuilder | Comparação Top 4
  4. Principais diferenças - Jira vs Github