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

StackOverflow https://stackoverflow.com/questions/287842

  •  08-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

StringBuilder перераспределяет свой буфер , тогда как строка содержит только сколько символов в ней содержится.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top