Різниця між String vs StringBuilder

У цій статті String vs StringBuilder обидва представляють послідовність символів, першою відмінністю між ними є клас String в просторі імен системи, тоді як StringBuilder знаходиться в System. Простір імен тексту.

Основна різниця:

String є незмінним : Після створення екземпляра String ви не можете його змінити. Якщо ви зміните значення рядка, то це збереже старий екземпляр і створить новий екземпляр з новим значенням у пам'яті.

StringBuilder є змінним : Якщо ви зміните значення рядка за допомогою StringBuilder, він не створить новий екземпляр, а оновить значення в існуючому екземплярі.

Порівняння між головами та струнами між StringBuilder (Інфографіка)

Нижче наведено 8 найкращих порівнянь між String та StringBuilder :

Основні відмінності між String і StringBuilder

Давайте обговоримо деякі ключові відмінності між String проти StringBuilder у наступних пунктах:

1. Працюючи з класом String, щоразу, коли виконуються певні операції над рядком, ви відтворюєте всю послідовність у пам'яті знову і знову, тоді як StringBuilder виділяє деякий буферний простір у пам'яті та застосовує зміни до цього буферного простору.

2. Оскільки об'єкт StringBuilder є змінним, він забезпечує кращу ефективність порівняно з об'єктом String, коли задіяні важкі струнні маніпуляції.

Давайте розберемося з наведеними вище пунктами за допомогою прикладу, наведеного нижче:

Код:

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

Вихід:

3. String-операції використовують більше пам'яті в порівнянні з StringBuilder, оскільки String створює проміжні екземпляри сміття після кожної операції. Давайте подивимось це на прикладі нижче:

Код:

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

Вихід:

Образотворче представлення внутрішньої роботи вищевказаної програми:

4. Строкові об'єкти можуть використовуватися через потоки, тоді як об'єкти StringBuilder не є безпечними для потоків. Таким чином, два або більше потоків можуть викликати методи StringBuilder одночасно.

5. Оскільки об'єкти String є безпечними для потоків, вони забезпечують синхронізацію, тоді як StringBuilder не забезпечує синхронізацію.

6. Клас String використовується, коли значення рядка залишатиметься постійним протягом усієї програми або коли в ньому потрібно зовсім менше модифікацій, тоді як StringBuilder використовується, коли для виконання рядка потрібно багато повторних модифікацій або важких операцій.

7. Для дуже меншої кількості конкатенацій клас String працює швидше порівняно з StringBuilder, оскільки розміщення символів у буферному просторі та потім перетворення всього значення в рядок створює накладні витрати. Таким чином, для невеликої кількості конкатенацій StringBuilder працює повільніше порівняно з поведінкою класу String за копіюванням за значенням.

8. Для перетворення об'єкта String в об'єкт StringBuilder нам потрібно передати об'єкт String конструктору класу StringBuilder, тоді як об’єкт StringBuilder можна перетворити на String за допомогою методу ToString ().

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

Таблиця порівняння String vs StringBuilder

У таблиці нижче наведено порівняння між String та StringBuilder :

Параметр Рядок StringBuilder
Простір іменКлас рядків знаходиться в просторі імен системи.Клас StringBuilder знаходиться в просторі імен системного тексту.
ЗмінюваністьРядок, створений за допомогою класу String, є незмінним.Рядок, створений за допомогою StringBuilder, може змінюватися.
ПродуктивністьПовільний порівняно зі StringBuilder.Швидкий порівняно зі String. Начебто це швидше, ніж String, при цьому об'єднуючи багато струн разом у циклі.
Безпека ниткиНитка безпечна.Не безпечно для ниток.
СинхронізаціяЗабезпечує синхронізацію.Він не забезпечує синхронізацію.
Використання пам'ятіПотрібно більше пам’яті для створення нового примірника, якщо операції, виконані над рядком, змінюють його значення.Для оновлення наявного екземпляра потрібно менше пам'яті.
Характер об’єктаОб'єкт String має характер лише для читання.Об'єкт StringBuilder має динамічний характер.
ЕфективністьКлас струн менш ефективний порівняно з StringBuilder при роботі з великою кількістю струнних конкатенацій.StringBuilder є більш ефективним порівняно зі String при роботі з великою кількістю струнних конкатенацій.

Висновок

String створює новий екземпляр лише тоді, коли змінюється значення рядка. Якщо ви виконаєте певні операції над рядком, який не змінює його значення, то не буде створено жодного нового екземпляра за допомогою String. Два або більше рядкових літералів з однаковим вмістом можуть мати одне і те ж місце в пам'яті.

Рекомендовані статті

Це посібник щодо найкращої різниці між String проти StringBuilder. Тут ми також обговорюємо ключові відмінності String vs StringBuilder за допомогою інфографіки та таблиці порівняння. Ви також можете переглянути наступні статті, щоб дізнатися більше -

  1. Топ 7 видів шифру
  2. Переваги StringBuilder в C #
  3. StringBuffer vs StringBuilder | Топ-4 порівняння
  4. Найкращі відмінності - Джира проти Гітхуба