Różnica między String a StringBuilder

W tym artykule String vs StringBuilder, oba reprezentują sekwencję znaków, pierwsza różnica między nimi polega na tym, że klasa String znajduje się w przestrzeni nazw System, podczas gdy StringBuilder znajduje się w Systemie. Przestrzeń nazw tekstowych.

Główną różnicą jest:

Ciąg jest niezmienny : po utworzeniu wystąpienia ciągu nie można go zmienić. Jeśli zmienisz wartość ciągu, spowoduje to zachowanie starej instancji i utworzenie nowej instancji z nową wartością w pamięci.

StringBuilder jest zmienny : Jeśli zmienisz wartość ciągu za pomocą StringBuilder, nie utworzy on nowej instancji, zamiast tego zaktualizuje wartość w istniejącej instancji.

Bezpośrednie porównanie między String a StringBuilder (Infografika)

Poniżej znajduje się 8 najlepszych porównań między String a StringBuilder :

Kluczowe różnice między String a StringBuilder

Omówmy kilka kluczowych różnic między String a StringBuilder w następujących punktach:

1. Podczas pracy z klasą String za każdym razem, gdy wykonujesz jakieś operacje na łańcuchu, odtwarzasz cały łańcuch w pamięci w kółko, podczas gdy StringBuilder przydziela część bufora w pamięci i wprowadza modyfikacje do tego bufora.

2. Ponieważ obiekt StringBuilder jest zmienny, zapewnia lepszą wydajność w porównaniu do obiektu String, gdy w grę wchodzą ciężkie operacje na łańcuchach.

Rozumiemy powyższe punkty za pomocą przykładu podanego poniżej:

Kod:

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);
)
)

Wynik:

3. Operacje na łańcuchach wykorzystują więcej pamięci w porównaniu do StringBuilder, ponieważ po każdej operacji łańcuch tworzy pośrednie instancje śmieci. Zobaczmy to w poniższym przykładzie:

Kod:

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();
)
)

Wynik:

Obrazowa reprezentacja wewnętrznego funkcjonowania powyższego programu:

4. Obiekty String mogą być używane w wątkach, podczas gdy obiekty StringBuilder nie są bezpieczne dla wątków. Zatem dwa lub więcej wątków może wywoływać metody StringBuilder jednocześnie.

5. Ponieważ obiekty String są bezpieczne dla wątków, zapewniają synchronizację, podczas gdy StringBuilder nie zapewnia synchronizacji.

6. Klasa ciągu jest używana, gdy wartość ciągu pozostanie stała w całym programie lub gdy będzie wymagało bardzo mniej modyfikacji, podczas gdy StringBuilder jest używany, gdy wiele ciągłych modyfikacji lub ciężkich operacji jest wymaganych do wykonania ciągu.

7. W przypadku bardzo mniejszej liczby konkatenacji klasa String działa szybciej w porównaniu do StringBuilder, ponieważ umieszczenie znaków w przestrzeni buforowej, a następnie ponowne przekonwertowanie całej wartości na string, powoduje narzut. Dlatego w przypadku niewielkiej liczby konkatenacji StringBuilder działa wolniej w porównaniu z zachowaniem klasy String w przypadku kopiowania według wartości.

8. Aby przekonwertować obiekt String na obiekt StringBuilder, musimy przekazać obiekt String do konstruktora klasy StringBuilder, podczas gdy obiekt StringBuilder można przekonwertować na String za pomocą metody ToString ().

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

Tabela porównawcza String vs StringBuilder

Poniższa tabela podsumowuje porównania między String a StringBuilder :

Parametr Strunowy StringBuilder
Przestrzeń nazwKlasa ciągu znajduje się w przestrzeni nazw Systemu.Klasa StringBuilder znajduje się w przestrzeni nazw System Text.
ZmiennośćCiąg utworzony za pomocą klasy String jest niezmienny.Łańcuch utworzony za pomocą StringBuilder można modyfikować.
WystępWolno w porównaniu do StringBuilder.Szybki w porównaniu do String. Jakby jest szybszy niż String podczas łączenia wielu łańcuchów w pętli.
Bezpieczeństwo wątkówBezpieczny dla wątków.Nie jest bezpieczny dla wątków.
SynchronizacjaZapewnia synchronizację.Nie zapewnia synchronizacji.
Zużycie pamięciWymaga więcej pamięci, aby utworzyć nową instancję, jeśli operacje wykonywane na łańcuchu zmienią jego wartość.Wymaga mniej pamięci, ponieważ aktualizuje istniejącą instancję.
Natura przedmiotuObiekt String ma charakter tylko do odczytu.Obiekt StringBuilder ma charakter dynamiczny.
WydajnośćKlasa string jest mniej wydajna w porównaniu do StringBuilder podczas pracy z dużą liczbą konkatenacji łańcuchów.StringBuilder jest bardziej wydajny niż String podczas pracy z dużą liczbą konkatenacji łańcuchów.

Wniosek

Ciąg tworzy nowe wystąpienie tylko wtedy, gdy zmienia się wartość ciągu. Jeśli wykonasz pewne operacje na łańcuchu, który nie zmienia jego wartości, nie powstanie żadna nowa instancja przez String. Dwa lub więcej literałów łańcuchowych o tej samej treści może mieć tę samą lokalizację pamięci.

Polecane artykuły

Jest to przewodnik po najważniejszej różnicy między String a StringBuilder. Tutaj omawiamy również kluczowe różnice między String a StringBuilder za pomocą infografiki i tabeli porównawczej. Możesz także zapoznać się z następującymi artykułami, aby dowiedzieć się więcej -

  1. Top 7 rodzajów szyfrów
  2. Zalety StringBuilder w C #
  3. StringBuffer vs StringBuilder | Najlepsze porównanie 4
  4. Najważniejsze różnice - Jira vs Github