Rozdíl mezi řetězcem a řetězcem StringBuilder

V tomto článku String vs StringBuilder, oba představují posloupnost znaků, první rozdíl mezi nimi je třída String je v oboru názvů systému, zatímco StringBuilder je v systému. Textový jmenný prostor.

Hlavní rozdíl je:

Řetězec je neměnný : Jakmile vytvoříte instanci Řetězce, nemůžete ji změnit. Pokud změníte hodnotu řetězce, zachová se původní instance a vytvoří se nová instance s novou hodnotou v paměti.

StringBuilder je Meable : Pokud změníte hodnotu řetězce pomocí StringBuilder, nevytvoří novou instanci, ale aktualizuje hodnotu v existující instanci.

Srovnání hlava-hlava mezi řetězcem StringBuilder (infografika)

Níže je osm nejlepších srovnání mezi String a StringBuilder :

Klíčové rozdíly mezi String vs StringBuilder

Pojďme diskutovat o některých klíčových rozdílech mezi String vs StringBuilder v následujících bodech:

1. Při práci s třídou String pokaždé, když na řetězci provádíte nějaké operace, znovu a znovu vytváříte celý řetězec v paměti, zatímco StringBuilder přiděluje v paměti nějaký vyrovnávací prostor a do tohoto vyrovnávacího prostoru aplikuje změny.

2. Protože je objekt StringBuilder zaměnitelný, poskytuje lepší výkon ve srovnání s objektem String, pokud se jedná o manipulaci s těžkými řetězci.

Chápeme výše uvedené body pomocí příkladu uvedeného níže:

Kód:

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

Výstup:

3. Řetězcové operace využívají více paměti ve srovnání se StringBuilderem, protože řetězec vytváří po každé operaci střední instance odpadu. Uvidíme to v níže uvedeném příkladu:

Kód:

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

Výstup:

Obrazové znázornění interního fungování výše uvedeného programu:

4. Řetězcové objekty lze použít napříč vlákny, zatímco objekty StringBuilder nejsou bezpečné pro vlákna. Dvě nebo více vláken tak mohou volat metody StringBuilder současně.

5. Jelikož objekty String jsou bezpečné pro vlákna, poskytují synchronizaci, zatímco StringBuilder neposkytuje synchronizaci.

6. Třída String se používá, když hodnota řetězce zůstane konstantní v průběhu programu nebo když je na něm vyžadováno velmi málo úprav, zatímco StringBuilder se používá, když je na řetězci vyžadováno mnoho opakovaných úprav nebo těžkých operací.

7. Pro velmi menší počet zřetězení funguje třída String ve srovnání se StringBuilderem rychleji, protože přizpůsobení znaků ve vyrovnávací paměti a opět převedení celé hodnoty na řetězec vytváří režii. Pro malý počet zřetězení tedy StringBuilder pracuje pomaleji ve srovnání s chováním třídy „String-Value-Value“.

8. Chcete-li převést objekt String na objekt StringBuilder, musíme předat objekt String konstruktoru třídy StringBuilder, zatímco objekt StringBuilder lze převést na řetězec pomocí metody ToString ().

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

Srovnávací tabulka String vs StringBuilder

Níže uvedená tabulka shrnuje srovnání mezi String vs StringBuilder :

Parametr Tětiva StringBuilder
Jmenný prostorTřída řetězce je v oboru názvů systému.Třída StringBuilder je ve jmenném prostoru System Text.
ProměnlivostŘetězec vytvořený pomocí třídy String je neměnný.Řetězec vytvořený pomocí StringBuilder je proměnlivý.
VýkonPomalý ve srovnání s StringBuilder.Rychle ve srovnání se Stringem. Jako by to bylo rychlejší než String a zároveň spojilo mnoho řetězců dohromady do smyčky.
Bezpečnost závituVlákno bezpečné.Nejsou bezpečné.
SynchronizacePoskytuje synchronizaci.Neposkytuje synchronizaci.
Využití pamětiVyžaduje více paměti pro vytvoření nové instance, pokud operace prováděné na řetězci změní jeho hodnotu.Vyžaduje méně paměti, protože aktualizuje existující instanci.
Povaha objektuObjekt String je v přírodě pouze pro čtení.Objekt StringBuilder je svou povahou dynamický.
ÚčinnostTřída String je méně účinná ve srovnání se StringBuilder při práci s velkým počtem řetězcových zřetězeních.StringBuilder je účinnější ve srovnání s String při práci s velkým počtem řetězcových zřetězeních.

Závěr

Řetězec vytvoří novou instanci, pouze když se změní hodnota řetězce. Pokud provádíte určité operace s řetězcem, který nezmění jeho hodnotu, nebude vytvořeno žádné nové instance pomocí String. Dva nebo více řetězcových literálů se stejným obsahem mohou mít stejné umístění v paměti.

Doporučené články

Toto je průvodce po největším rozdílu mezi String vs StringBuilder. Tady také diskutujeme o klíčových rozdílech String vs StringBuilder s infografikou a srovnávací tabulkou. Další informace naleznete také v následujících článcích -

  1. Top 7 typů šifry
  2. Výhody StringBuilder v C #
  3. StringBuffer vs StringBuilder | Porovnání top 4
  4. Nejlepší rozdíly - Jira vs Github

Kategorie: