Является ли StringBuilder.Replace() более эффективным, чем String.Replace?

Если вам нужно использовать String.Replace(), чтобы заменить тест 50 раз, вам, по сути, нужно создать новую строку 50 раз. Улучшает ли StringBuilder.Replace() это более эффективно? Например, следует ли использовать StringBuilder, если я собираюсь заменить много текста, даже если я не буду добавлять к нему какие-либо данные?

Я использую .NET, но я предполагаю, что это будет то же самое, что и Java и, возможно, другие языки.

Ответ 1

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

Ответ 2

Это зависит, если размер замены больше, чем замененная строка.

StringBuilder over выделяет свой буфер, тогда как строка только когда-либо хранит, как много символов в ней.

Свойство StringBuilder.Capacity - это количество символов, которое будет храниться в буфере, а StringBuilder.Length - сколько символов используется.

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

Установив значение Capacity при запуске (например, в конструкторе), вы сохраняете перераспределения буфера StringBuilder. Вы можете использовать StringBuilder.MaxCapacity, чтобы ограничить максимальную емкость, которую может быть расширена StringBuilder.

Ответ 3

Да, это так. String.Replace всегда создает новую строку - StringBuilder.Replace не делает.