Разница между String и StringBuilder

В этой статье String vs StringBuilder представляют последовательность символов, первое различие между ними заключается в том, что класс String находится в пространстве имен System, тогда как StringBuilder находится в System. Текстовое пространство имен.

Основное отличие заключается в:

Строка неизменна : после создания экземпляра строки вы не можете его изменить. Если вы измените значение строки, это сохранит старый экземпляр и создаст новый экземпляр с новым значением в памяти.

StringBuilder является изменяемым : если вы измените значение строки с помощью StringBuilder, он не создаст новый экземпляр, а обновит значение в существующем экземпляре.

Сравнение лицом к лицу между String и 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. Строковые операции используют больше памяти по сравнению с 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. Строковый класс используется, когда значение строки будет оставаться постоянным во всей программе или когда для него требуется очень мало модификаций, тогда как 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 и StringBuilder

В таблице ниже приведены сравнения между String и StringBuilder :

параметр строка StringBuilder
Пространство именКласс string находится в пространстве имен System.Класс StringBuilder находится в пространстве имен System Text.
переменчивостьСтрока, созданная с использованием класса String, является неизменной.Строка, созданная с помощью StringBuilder, является изменчивой.
ПроизводительностьМедленный по сравнению с StringBuilder.Быстро по сравнению со строкой. Как будто это быстрее, чем String при объединении многих строк в цикле.
Поток безопасностиПотокобезопасна.Не потокобезопасен.
синхронизацияОбеспечивает синхронизацию.Это не обеспечивает синхронизацию.
Использование памятиТребуется больше памяти для создания нового экземпляра, если операции, выполняемые со строкой, меняют ее значение.Требуется меньше памяти, поскольку он обновляет существующий экземпляр.
Природа объектаОбъект String доступен только для чтения.Объект StringBuilder является динамическим по своей природе.
КПДКласс String менее эффективен по сравнению с StringBuilder при работе с большим количеством конкатенаций строк.StringBuilder более эффективен по сравнению со String при работе с большим количеством конкатенаций строк.

Вывод

Строка создает новый экземпляр только тогда, когда изменяется значение строки. Если вы выполняете определенные операции со строкой, которая не меняет ее значения, тогда не будет никакого нового создания экземпляра с помощью String. Два или более строковых литерала с одинаковым содержимым могут иметь одинаковое расположение в памяти.

Рекомендуемые статьи

Это руководство по разнице между String и StringBuilder. Здесь мы также обсудим ключевые различия между String и StringBuilder с помощью инфографики и таблицы сравнения. Вы также можете взглянуть на следующие статьи, чтобы узнать больше -

  1. 7 лучших типов шифров
  2. Преимущества StringBuilder в C #
  3. StringBuffer против StringBuilder | Топ 4 Сравнение
  4. Основные отличия - Jira vs Github