Является ли StringBuilder.Replace () более эффективным, чем String.Replace? - PullRequest
28 голосов
/ 13 ноября 2008

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

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

Ответы [ 3 ]

29 голосов
/ 13 ноября 2008

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

8 голосов
/ 13 ноября 2008

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

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

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

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

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

5 голосов
/ 13 ноября 2008

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

...