Перейти к содержимому

Stringbuilder c что это

  • автор:

Использование класса StringBuilder в .NET

Объект String является неизменяемым. Каждый раз при использовании одного из методов в классе System.String вы создаете объект строки в памяти, для которого требуется выделение нового пространства. В случаях, когда необходимо выполнять повторяющиеся изменения строки, издержки, связанные с созданием объекта String, могут оказаться значительными. Чтобы изменять строку без создания нового объекта, можно использовать класс System.Text.StringBuilder. Например, использование класса StringBuilder может повысить производительность при соединении большого количества строк в цикле.

Импорт пространства имен System.Text

Класс StringBuilder находится в пространстве имен System.Text. Чтобы избежать необходимости в указании полного имени типа в коде System.Text , можно импортировать пространство имен:

using namespace System; using namespace System::Text; 
using System; using System.Text; 
Imports System.Text 

Создание экземпляров объекта StringBuilder

Вы можете создать экземпляр класса StringBuilder путем инициализации переменной с помощью одного из перегруженных методов конструктора, как показано в следующем примере.

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!"); 
StringBuilder myStringBuilder = new StringBuilder("Hello World!"); 
Dim myStringBuilder As New StringBuilder("Hello World!") 

Настройка емкости и длины

Хотя StringBuilder является динамическим объектом, который позволяет вам развернуть ряд символов в строке, которые она инкапсулирует, вы можете указать максимальное число содержащихся в ней символов. Это значение называется емкостью объекта, и его не следует путать с длиной строки, которую содержит текущий объект StringBuilder. Например, вы можете создать экземпляр класса StringBuilder со строкой Hello, длина которой составляет 5 символов, указав при этом максимальную емкость объекта 25 символов. При изменении значения StringBuilder размер не перераспределяется, если не достигнута максимальная емкость. Когда это происходит, новое пространство выделяется автоматически, а емкость удваивается. Вы можете указать емкость класса StringBuilder с помощью одного из перегруженных конструкторов. В следующем примере показано, что объект myStringBuilder можно развернуть максимум на 25 позиций.

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!", 25); 
StringBuilder myStringBuilder = new StringBuilder("Hello World!", 25); 
Dim myStringBuilder As New StringBuilder("Hello World!", 25) 

Кроме того, вы можете использовать доступное для чтения или записи свойство Capacity, чтобы задать максимальную длину объекта. В следующем примере используется свойство Capacity для определения максимальной длины объекта.

myStringBuilder->Capacity = 25; 
myStringBuilder.Capacity = 25; 
myStringBuilder.Capacity = 25 

Метод EnsureCapacity можно использовать для проверки емкости текущего объекта StringBuilder. Если емкость больше переданного значения, изменения не вносятся; однако если емкость меньше переданного значения, текущая емкость изменяется для соответствия переданному значению.

Можно также просмотреть или задать свойство Length. Если вы задали для свойства Length значение больше значения свойства Capacity, значение свойства Capacity будет автоматически изменено на то же самое значение, что и у свойства Length. Если задать для свойства Length значение меньше длины строки в текущем объекте StringBuilder, строка будет укорочена.

Изменение строки StringBuilder

В следующей таблице перечислены методы, которые можно использовать для изменения содержимого объекта StringBuilder.

Имя метода Использовать
StringBuilder.Append Добавляет сведения в конец текущего объекта StringBuilder.
StringBuilder.AppendFormat Заменяет отформатированным текстом описатель формата, переданный в строке.
StringBuilder.Insert Вставляет строку или объект в указанный индекс текущего объекта StringBuilder.
StringBuilder.Remove Удаляет указанное количество символов из текущего объекта StringBuilder.
StringBuilder.Replace Замещает все вхождения указанного символа или строки в текущем StringBuilder на другой указанный символ или строку.

Добавить

Метод Append позволяет добавить текст или строковое представление объекта к концу строки, представленной текущим объектом StringBuilder. Следующий пример инициализирует StringBuilder с текстом Hello World, а затем добавляет текст в конец объекта. Пространство выделяется автоматически при необходимости.

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!"); myStringBuilder->Append(" What a beautiful day."); Console::WriteLine(myStringBuilder); // The example displays the following output: // Hello World! What a beautiful day. 
StringBuilder myStringBuilder = new StringBuilder("Hello World!"); myStringBuilder.Append(" What a beautiful day."); Console.WriteLine(myStringBuilder); // The example displays the following output: // Hello World! What a beautiful day. 
Dim myStringBuilder As New StringBuilder("Hello World!") myStringBuilder.Append(" What a beautiful day.") Console.WriteLine(myStringBuilder) ' The example displays the following output: ' Hello World! What a beautiful day. 

AppendFormat

Метод StringBuilder.AppendFormat добавляет текс в конец объекта StringBuilder. Он поддерживает возможность составного форматирования (дополнительные сведения см. в статье Составное форматирование) путем вызова реализации IFormattable для одного или нескольких форматируемых объектов. Следовательно, он принимает строки стандартного формата для числовых значений, значений даты и времени, значений перечисления, строки пользовательского формата для чисел и дат и строки формата, определенные для пользовательских типов. (Дополнительные сведения о форматировании см. в разделе Типы форматирования.) Вы можете использовать этот метод для настройки формата переменных и добавления этих значений к StringBuilder. В следующем примере метод AppendFormat помещает в конец объекта StringBuilder целочисленное значение, отформатированное в виде значения валюты.

int MyInt = 25; StringBuilder^ myStringBuilder = gcnew StringBuilder("Your total is "); myStringBuilder->AppendFormat(" ", MyInt); Console::WriteLine(myStringBuilder); // The example displays the following output: // Your total is $25.00 
int MyInt = 25; StringBuilder myStringBuilder = new StringBuilder("Your total is "); myStringBuilder.AppendFormat(" ", MyInt); Console.WriteLine(myStringBuilder); // The example displays the following output: // Your total is $25.00 
Dim MyInt As Integer = 25 Dim myStringBuilder As New StringBuilder("Your total is ") myStringBuilder.AppendFormat(" ", MyInt) Console.WriteLine(myStringBuilder) ' The example displays the following output: ' Your total is $25.00 

Insert

Метод Insert добавляет строку или объект в указанную позицию в текущем объекте StringBuilder. В следующем примере этот метод вставляет слово в шестую позицию объекта StringBuilder.

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!"); myStringBuilder->Insert(6,"Beautiful "); Console::WriteLine(myStringBuilder); // The example displays the following output: // Hello Beautiful World! 
StringBuilder myStringBuilder = new StringBuilder("Hello World!"); myStringBuilder.Insert(6,"Beautiful "); Console.WriteLine(myStringBuilder); // The example displays the following output: // Hello Beautiful World! 
Dim myStringBuilder As New StringBuilder("Hello World!") myStringBuilder.Insert(6, "Beautiful ") Console.WriteLine(myStringBuilder) ' The example displays the following output: ' Hello Beautiful World! 

Удалить

Вы можете использовать метод Remove, чтобы удалить указанное количество символов из текущего объекта StringBuilder, начиная с указанного индекса (с отсчетом с нуля). В следующем примере метод Remove используется для сокращения объекта StringBuilder.

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!"); myStringBuilder->Remove(5,7); Console::WriteLine(myStringBuilder); // The example displays the following output: // Hello 
StringBuilder myStringBuilder = new StringBuilder("Hello World!"); myStringBuilder.Remove(5,7); Console.WriteLine(myStringBuilder); // The example displays the following output: // Hello 
Dim myStringBuilder As New StringBuilder("Hello World!") myStringBuilder.Remove(5, 7) Console.WriteLine(myStringBuilder) ' The example displays the following output: ' Hello 

Замените

Метод Replace можно использовать для замены символов в объекте StringBuilder другими указанными символами. В следующем примере метод Replace находит все экземпляры восклицательного знака (!) в объекте StringBuilder и заменяет их знаками вопроса (?).

StringBuilder^ myStringBuilder = gcnew StringBuilder("Hello World!"); myStringBuilder->Replace('!', '?'); Console::WriteLine(myStringBuilder); // The example displays the following output: // Hello World? 
StringBuilder myStringBuilder = new StringBuilder("Hello World!"); myStringBuilder.Replace('!', '?'); Console.WriteLine(myStringBuilder); // The example displays the following output: // Hello World? 
Dim myStringBuilder As New StringBuilder("Hello World!") myStringBuilder.Replace("!"c, "?"c) Console.WriteLine(myStringBuilder) ' The example displays the following output: ' Hello World? 

Преобразование объекта StringBuilder в строку

Необходимо преобразовать объект StringBuilder в String, прежде чем передавать представленную объектом StringBuilder строку методу, который содержит параметр String, или вывести ее в пользовательском интерфейсе. Это преобразование можно выполнить, вызвав метод StringBuilder.ToString. Следующий пример вызывает несколько методов StringBuilder, а затем вызывает метод StringBuilder.ToString() для отображения строки.

using System; using System.Text; public class Example < public static void Main() < StringBuilder sb = new StringBuilder(); bool flag = true; string[] spellings = < "recieve", "receeve", "receive" >; sb.AppendFormat("Which of the following spellings is :", flag); sb.AppendLine(); for (int ctr = 0; ctr <= spellings.GetUpperBound(0); ctr++) < sb.AppendFormat(" . ", ctr, spellings[ctr]); sb.AppendLine(); > sb.AppendLine(); Console.WriteLine(sb.ToString()); > > // The example displays the following output: // Which of the following spellings is True: // 0. recieve // 1. receeve // 2. receive 
Imports System.Text Module Example Public Sub Main() Dim sb As New StringBuilder() Dim flag As Boolean = True Dim spellings() As String = sb.AppendFormat("Which of the following spellings is :", flag) sb.AppendLine() For ctr As Integer = 0 To spellings.GetUpperBound(0) sb.AppendFormat(" . ", ctr, spellings(ctr)) sb.AppendLine() Next sb.AppendLine() Console.WriteLine(sb.ToString()) End Sub End Module ' The example displays the following output: ' Which of the following spellings is True: ' 0. recieve ' 1. receeve ' 2. receive 

См. также

  • System.Text.StringBuilder
  • Базовые операции со строками в .NET Framework
  • Типы форматирования

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Stringbuilder c что это

Хотя класс System.String предоставляет нам широкую функциональность по работе со строками, все таки он имеет свои недостатки. Прежде всего, объект String представляет собой неизменяемую строку. Когда мы выполняем какой-нибудь метод класса String, система создает новый объект в памяти с выделением ему достаточного места. Удаление первого символа — не самая затратная операция. Однако когда подобных операций множество, а объем текста, для которого надо выполнить данные операции, также не самый маленький, то издержки при потере производительности становятся более существенными.

Чтобы выйти из этой ситуации во фреймворк .NET был добавлен новый класс StringBuilder , который находится в пространстве имен System.Text . Этот класс представляет динамическую строку.

Создание StringBuilder

Для создания объекта StringBuilder можно использовать ряд его конструкторов. Прежде всего можно создать пустой StringBuilder:

using System.Text; StringBuilder sb = new StringBuilder();

Можно сразу инициализировать объект определенной строкой:

StringBuilder sb = new StringBuilder("Привет мир");

С помощью метода ToString() мы можем получить строку, которая хранится в StringBuilder:

var sb = new StringBuilder("Hello World"); Console.WriteLine(sb.ToString()); // Hello World

Либо можно просто передать объект StringBuilder:

var sb = new StringBuilder("Hello World"); Console.WriteLine(sb); // Hello World

Длина и емкость StringBuilder

Для хранения длины строки в классе StringBuilder определенно свойство Length . Однако есть и вторая величина — емкость выделенной памяти. Это значение хранится в свойстве Capacity . Емкость — это выделенная память под объект. Установка емкости позволяет уменьшить выделения памяти и тем самым повысить производительность.

Если строка, которая передается в конструктор StringBuilder, имеет длину 16 символов или меньше, то начальная ёмкость в StringBuilder равна 16. Если начальная строка больше 16 символов, то в качестве начальной емкости StringBuilder будет использовать длину строки.

Например, посмотрим, что содержат данные свойства:

using System.Text; StringBuilder sb = new StringBuilder("Привет мир"); Console.WriteLine($"Длина: "); // Длина: 10 Console.WriteLine($"Емкость: "); // Емкость: 16

Хотя в данном случае длина равна 10 символов, но реально емкость будет составлять по умолчанию 16 символов. То есть мы видим, что при создании строки StringBuilder выделяет памяти больше, чем необходимо этой строке. При увеличении строки в StringBuilder, когда количество символов превосходит начальную емкость, то емкость увеличивается в два и более раз.

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

var sb = new StringBuilder(32);

StringBuilder также позволяет сразу задать строку и емкость:

var sb = new StringBuilder("Привет мир", 32);

Операции со строками в StringBuilder

Для операций над строками класс StringBuilder определяет ряд методов:

  • Append : добавляет подстроку в объект StringBuilder
  • Insert : вставляет подстроку в объект StringBuilder, начиная с определенного индекса
  • Remove : удаляет определенное количество символов, начиная с определенного индекса
  • Replace : заменяет все вхождения определенного символа или подстроки на другой символ или подстроку
  • AppendFormat : добавляет подстроку в конец объекта StringBuilder

Теперь посмотрим на примере метода Append() использование и преимущества класса StringBuilder:

using System.Text; var sb = new StringBuilder("Название: "); Console.WriteLine(sb); // Название: Console.WriteLine($"Длина: "); // 10 Console.WriteLine($"Емкость: "); // 16 sb.Append(" Руководство"); Console.WriteLine(sb); // Название: Руководство Console.WriteLine($"Длина: "); // 22 Console.WriteLine($"Емкость: "); // 32 sb.Append(" по C#"); Console.WriteLine(sb); // Название: Руководство по C# Console.WriteLine($"Длина: "); // 28 Console.WriteLine($"Емкость: "); // 32

При создании объекта StringBuilder выделяется память по умолчанию для 16 символов, так как длина начальной строки меньше 16.

Дальше применяется метод Append — этот метод добавляет к строке подстроку. Так как при объединении строк их общая длина — 22 символа — превышает начальную емкость в 16 символов, то начальная емкость удваивается — до 32 символов.

Если бы итоговая длина строки была бы больше 32 символов, то емкость расширялась бы до размера длины строки.

Далее опять применяется метод Append, однако финальная длина уже будет 28 символов, что меньше 32 символов, и дополнительная память не будет выделяться.

Используем остальные методы StringBuilder:

var sb = new StringBuilder("Привет мир"); sb.Append("!"); sb.Insert(7, "компьютерный "); Console.WriteLine(sb); // Привет компьютерный мир! // заменяем слово sb.Replace("мир", "world"); Console.WriteLine(sb); // Привет компьютерный world! // удаляем 13 символов, начиная с 7-го sb.Remove(7, 13); Console.WriteLine(sb); // Привет world! // получаем строку из объекта StringBuilder string text = sb.ToString(); Console.WriteLine(text); // Привет world!

Когда надо использовать класс String, а когда StringBuilder?

Microsoft рекомендует использовать класс String в следующих случаях:

  • При небольшом количестве операций и изменений над строками
  • При выполнении фиксированного количества операций объединения. В этом случае компилятор может объединить все операции объединения в одну
  • Когда надо выполнять масштабные операции поиска при построении строки, например IndexOf или StartsWith. Класс StringBuilder не имеет подобных методов.

Класс StringBuilder рекомендуется использовать в следующих случаях:

  • При неизвестном количестве операций и изменений над строками во время выполнения программы
  • Когда предполагается, что приложению придется сделать множество подобных операций

Класс StringBuilder

Когда строка конструируется классом String, выделяется ровно столько памяти, сколько необходимо для хранения данной строки. Однако, в пространстве имен System.Text имеется класс StringBuilder, который поступает лучше и обычно выделяет больше памяти, чем нужно в данный момент. У вас, как разработчика, есть возможность указать, сколько именно памяти должен выделить StringBuilder, но если вы этого не сделаете, то будет выбран объем по умолчанию, который зависит от размера начального текста, инициализирующего экземпляр StringBuilder. Класс StringBuilder имеет два главных свойства:

  • Length, показывающее длину строки, содержащуюся в объекте в данный момент
  • Capacity, указывающее максимальную длину строки, которая может поместиться в выделенную для объекта память

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

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 < class Program < static void Main(string[] args) < StringBuilder hello = new StringBuilder("Привет, меня зовут Александр Ерохин",120); hello.AppendFormat("Я рад вас приветствовать на моем сайте professorweb.ru"); >> > 

В данном примере начальная емкость StringBuilder равна 120. Всегда лучше сразу указывать емкость, превышающую предполагаемую длину строки, чтобы объекту StringBuilder не приходилось заново выделять память при переполнении. По умолчанию устанавливается емкость в 16 символов. Схематически данный пример работает следующим образом:

Принцип работы StringBuilder

Т.е. при вызове метода AppendFormat() остаток текста помещается в пустое пространство без необходимости перераспределения памяти. Однако реальная эффективность, которую несет с собой применение StringBuilder, проявляется при выполнении повторных подстановок текста.

В следующей таблице перечислены основные методы класса StringBuilder:

Методы класса StringBuilder

Метод Назначение
Append() Добавляет строку к текущей строке
AppendFormat() Добавляет строку, сформированную в соответствии со спецификатором формата
Insert() Вставляет подстроку в строку
Remove() Удаляет символ из текущей строки
Replace() Заменяет все вхождения символа другим символом или вхождения подстроки другой подстрокой
ToString() Возвращает текущую строку в виде объекта System.String (переопределение метода класса System.Object)

Давайте рассмотрим практический пример использования класса StringBuilder:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 < class Program < static void Main(string[] args) < StringBuilder hello = new StringBuilder("Привет, меня зовут Александр Ерохин",120); hello.AppendFormat(" Я рад вас приветствовать на моем сайте professorweb.ru"); // Зашифруем строку, хранящуюся в переменной hello Console.WriteLine("Исходная строка: \n \n",hello); for (int i = 'я'; i >= 'a'; i--) hello = hello.Replace((char)i,(char)(i+3)); Console.WriteLine("Зашифрованная строка:\n ",hello); Console.ReadLine(); > > >

Stringbuilder c что это

Спасибо, интересная статья. Уточнила для себя ещё отдельно, что метод insert() – в Java вставляет символы в данную строку буфера (StringBuffer). Подстрока добавляется перед указанным индексом.

рост Уровень 32
17 сентября 2022
Илья Ненашев Уровень 14
26 марта 2022

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

jenyaVarenkin Уровень 13
21 января 2022
великолепная статья, разложила все по полочкам. спасибо.
Tallahassee Уровень 18
1 июля 2021
Великолепная статья!
Павел Новиков Уровень 19
21 июля 2020
Только я нарисовал себе табличку в блокноте, как она оказывается в конце статьи есть)
Anton Уровень 41
17 июня 2020

случайно узнал что у StringBuffer и StringBuilder не переопределен метод equals, значит сравнивать их следует например вот так

 String.valueOf(s1).equals(String.valueOf(s2)) 

Евгений Шевцов Уровень 17
3 октября 2019
Подскажите, с какой версии Java «+» для String перегружен?
Сообщество

JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.

Подписывайтесь
Язык интерфейса
«Программистами не рождаются» © 2024 JavaRush
Скачивайте наши приложения
«Программистами не рождаются» © 2024 JavaRush

Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *